栈浅析[解密回文]

栈的实现很简单,只需要一个一维数组和一个指向栈顶的变量top就可以了。我们通过top来对栈进行插入和删除操作。

栈究竟有哪些作用呢?我们来看一个例子。“xyzyx”是一个回文字符串,所谓回文字符串就是指正读反读均相同的字符序列,如“席主席”、“记书记”、“aha”和“ahaha”均是回文,但“ahah”不是回文。通过栈这个数据结构我们将很容易判断一个字符串是否为回文。

如果一个字符串是回文的话,那么它必须是中间对称的,我们需要求中点,

mid=len/2-1;

我们先将mid之前的字符全部入栈。因为这里的栈是用来存储字符的,所以这里用来实现栈的数组类型是字符数组即char s[101];,初始化栈很简单,top=0;就可以了。入栈的操作是top++; s[top]=x;  (假设需要入栈的字符暂存在字符变量x中),其实可以简写为s[++top]=x;现在我们就来将mid之前的字符依次全部入栈。

for(i=0;i<=mid;i++)
{
    s[++top]=a[i];
} 

接下来进入判断回文的关键步骤。将当前栈中的字符依次出栈,看看是否能与mid之后的字符一一匹配,如果都能匹配则说明这个字符串是回文字符串,否则这个字符串就不是回文字符串。

#include <stdio.h>
#include <string.h> 

int main()
{
	char a[101],s[101];
	int i,len,mid,next,top; 

	gets(a); //读入一行字符串
	len=strlen(a); //求字符串的长度
	mid=len/2-1; //求字符串的中点

	top=0;//栈的初始化
	//将mid前的字符依次入栈
	for(i=0;i<=mid;i++)
		s[++top]=a[i]; 

	//判断字符串的长度是奇数还是偶数,并找出需要进行字符匹配的起始下标
	if(len%2==0)
		next=mid+1;
	else
		next=mid+2; 

	//开始匹配
	for(i=next;i<=len-1;i++)
	{
		if(a[i]!=s[top])
			break;
		top--;
	} 

	//如果top的值为0,则说明栈内所有的字符都被一一匹配了
	if(top==0)
		printf("YES");
	else
		printf("NO"); 

	return 0;
} 

利用栈还可以用来进行括号匹配等操作。

时间: 2024-10-11 06:59:31

栈浅析[解密回文]的相关文章

解密回文——栈

一.关于栈的介绍 栈是一种后进先出的数据结构,它限定为只能在一端进行插入和删除操作. 比如说有一个小桶,小桶的直径只能放一个小球,我们现在在小桶内依次放入2.1.3号小球.假如你现在需要拿出2号小球,那就必须先将3号小球拿出,再拿出1号小球,最后才能将2号小球拿出来.在刚才取小球的过程中,我们最先放进去的小球最后才能拿出来,最后放进去的小球却可以最先拿出来. 栈的实现需要一个一维数组和一个指向栈顶的变量top,通过top来对栈进行插入和删除的操作. 通过栈这个数据结构我们将很容易判断一个字符串是

c++实验4 栈及栈的应用+回文+中、后缀表达式

栈及栈的应用+回文+中.后缀表达式 1.栈顺序存储结构的基本操作算法实现 (1)栈顺序存储结构的类定义: class SeqStack { private: int maxsize; DataType *data; //顺序堆栈数组 int top; //栈顶位置指示器 public: SeqStack(int size); //构造函数 ~SeqStack(void) {} //析构函数 void Push(const DataType item); //入栈 DataType Pop(voi

算法——回文解密,判断一个素组是否为回文

算法中,队列是先进先出原则,而栈是后进先出原则,栈限定只能在一端进行插入和删除操作,而栈的作用有哪些? 可以通过一组回文字符串来看:"xyzyx",同过栈来判断字符串是否是回文 案例:package test; /** * @author dayu 解密回文--栈 * @version 创建时间:2017年11月13日 下午2:15:01 * 类说明 */ public class zhan { //回文--一定有对称轴,所以一定是单数 public static void main(

DS之顺序栈和链队实现回文判断

顺序栈和链队的基本操作就不再一一列举了,要想实现回文判断,先来了解什么是回文?"回文"一字符串正着读和反着读是相同的字符序列,如"abcba","abba"为"回文","abab"则不是"回文". 其次就是顺序栈和链队如何实现回文的判断?将输入的字符串依次入栈和入队,然后再依次出栈和出队,由于入栈和入队是相同的序列,然而出栈和出队是相反的序列,这就实现了回文的判断. 最后考虑要用到顺序栈

判断一个字符串是否为回文-链队(新建,进队,出队),链栈(新建,进栈,出栈)

回文:字符对称排列的字符串,例如ABCBA 思路:根据队:先进先出和栈: 先进后出的原则,进行比较出队和出栈的字符是否相等.如果相等,则为回文. 创建控制台应用程序. 1 #region 字符节点类 2 class CharNode 3 { 4 public char Char //字符 5 { 6 get; 7 set; 8 } 9 public CharNode Next //下一节点 10 { 11 get; 12 set; 13 } 14 public CharNode(char Cha

回文---栈

/*栈的实现只需要一个一维数组和一个指向栈顶的变量top就好了,通过top来对栈进行插入和删除操作,下面的代码是计算字符串是否是回文*/ #include <stdio.h> #include <string.h> int main() { char a[101],s[101]; int i,len,mid,next,top; gets(a); //读入一行字符串 len=strlen(a); //求字符串的长度 mid=len/2-1; //求字符串的中点 top=0;//栈的初

栈解决回文

首先,先说说栈. 栈:后进先出的数据结构,它叫做栈. 回文:就是像这样:"123321","1221".等就是回文. 解决方法:先把字符串前半截123或12压栈,然后再出栈和字符串后半截321比较,就OK. 上代码: #include <stdio.h> #include <stdlib.h> #include <string.h> /* 判断回文 */ int statckJudge(char *arr,int size) {

回文判断

一个整形数是否是回文 also leetcode 9 Palindrome Number要求空间复杂度O(1)按位判断一般是/和%的游戏,首先取首位 a/h (h是最接近a的10的次方,比如12321,h预计算出是10000), 再取末位a%10; 比较首位和末位是否相等,不等就返回false; 如图: 然后舍弃掉已经比较过的两个位数,从a中去掉首尾 12321 --> 232. a = a % h; // 去掉首 a = a /10; //去掉尾 h = 100; // 因为已经去掉了两位 如

判断回文

Decription: 输入一个字符串,判断其是否为回文. 是则输出,"True",否则输出"False" 题目最简单的做法就是,用两个指针指向字符串的首尾,然后逐个比对. 下面使用栈来判断: 将字符串全部push到栈里面,然后逐一pop出来跟原字符串中的字符逐一比较就能得到结果 #include <stdio.h> #include <malloc.h> #include <string.h> typedef struct no