上节学习了一种先进先出的数据结构——队列
这一节将要学习一种先进后出的一种数据结构——栈

举个例子:
比如说有一个小桶,小桶的直径只能放一个小球,我们现在小桶内依次放入 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.上代码:

fori=0i<=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");

栈还可以用来进行验证括号的匹配。比如输入一行只包含“()[]{}”的字符串,请判断形如“([{}()])”或者“{()[]{}}”的是否可以正确匹配。显然上面两个例子都是可以正确匹配的。“([)]”是不能匹配的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值