上节学习了一种先进先出的数据结构——队列
这一节将要学习一种先进后出的一种数据结构——栈
举个例子:
比如说有一个小桶,小桶的直径只能放一个小球,我们现在小桶内依次放入 2、1、3 号小球。假如你现在需要拿出 2 号小球,那就必须先将 3 号小球拿出,再拿出 1号小球, 后才能将 2 号小球拿出来。在刚才取小球的过程中,我们 先放进去的小球 后才能拿出来, 后放进去的小球却可以 先拿出来。
其实栈的实也很简单:只需要一个一维数组和一个指向数组的变量top就可以了(只能在一端进行操作)
这里介绍一种特殊的一串字符:回文串,回文串就是正着都反着读都一个样的一串字符,例如abcba,还有席主席……这里用栈就可以轻易实现回文串的判断等。
1首先定义数组存储回文串,回文串是关于中间对称的,然后我们取中点,mid=len/2-1;
初始化栈:int top=0;
2.接下来就轮到栈出场了,我们将中点以前的全部入栈 (将mid之前的字符全部入栈)
3.初始化栈:top=0
入栈操作:top++;s[top]=x;(假设需要入栈的字符全部储存在x中)
(简写为s[++top]=x;
4.上代码:
for(i=0;i<=mind;i++)
{
s[++top]=x;
}
5.接下来是关键步骤:将当前栈中的字符依次出现,看看是否能与mid之后的字符一一对应从而判断是否为回文串。
上代码:
for(i=mid+1;i<=len-1;i++)
{
if(a[i]!=a[top])
break;
top--;
}
if(top==0) //如果 top 的值为 0,就说明栈内所有的字符都被一一匹配了,那么这个字符串就是回文字符串
printf("YES");
else
printf("NO");
一个通过栈实现回文串的判断的完整代码如下:
#include<stdio.h>
#include<string.h>
int main()
{
int top=0,mid,len;
char s[101],a[101];
gets(s);
len=strlen(s);
mid=len/2-1;
top=0; //入栈开始。
for(int i=0;i<=mid;i++)
{
a[++top]=s[i];
}
//接下来判断是奇数还是偶数,并且找出相应下表
if(len/2==0)
next=mid+1;
else
next=mid+2;
//然后开始匹配。。
for(i=next;i<len;i++)
{
if(a[i]!=s[top]
break;
}
if(top==0);
printf("yes");
else
printf("no");
栈还可以用来进行验证括号的匹配。比如输入一行只包含“()[]{}”的字符串,请判断形如“([{}()])”或者“{()[]{}}”的是否可以正确匹配。显然上面两个例子都是可以正确匹配的。“([)]”是不能匹配的。