zoukankan      html  css  js  c++  java
  • 解密回文——栈

    一、关于栈的介绍

    栈是一种后进先出的数据结构,它限定为只能在一端进行插入和删除操作。

    比如说有一个小桶,小桶的直径只能放一个小球,我们现在在小桶内依次放入2、1、3号小球。假如你现在需要拿出2号小球,那就必须先将3号小球拿出,再拿出1号小球,最后才能将2号小球拿出来。在刚才取小球的过程中,我们最先放进去的小球最后才能拿出来,最后放进去的小球却可以最先拿出来。

    栈的实现需要一个一维数组和一个指向栈顶的变量top,通过top来对栈进行插入和删除的操作。

    通过栈这个数据结构我们将很容易判断一个字符串是否为回文。什么是回文?就是指正读反读均相同的字符序列,如“记书记” “abcba”均是回文。

    二、解密回文的步骤

    1,首先我们需要读取这行字符串,并求出这个字符串的长度。

        char a[101];
        int ,en;
        gets(a);  //读入一行字符串
        len=strlen(a);  //求字符串的长度

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

        mid=len/2-1; //求字符串的中点 

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

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

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

        /*开始匹配*/
        for(i=next;i<=len-1;i++)
        {
            if(a[i]!=s[top])
                break;
            top--;
        } 
        /*如果top的值为0,则说明栈内所有的字符都被一一匹配了*/
        if(top==0)
            printf("YES");
        else
            printf("NO");

    5,最后如果top的值为0,就说明栈内所有的字符都被一一匹配了,那么这个字符串就是回文字符串。

    三、完整代码

    #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;  //栈的初始化
        for(i=0;i<=mid;i++)  //将mid前的字符依次入栈 
            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; 
    }
    解密回文

          

  • 相关阅读:
    洛谷—— P2234 [HNOI2002]营业额统计
    BZOJ——3555: [Ctsc2014]企鹅QQ
    CodeVs——T 4919 线段树练习4
    python(35)- 异常处理
    August 29th 2016 Week 36th Monday
    August 28th 2016 Week 36th Sunday
    August 27th 2016 Week 35th Saturday
    August 26th 2016 Week 35th Friday
    August 25th 2016 Week 35th Thursday
    August 24th 2016 Week 35th Wednesday
  • 原文地址:https://www.cnblogs.com/OctoptusLian/p/6664686.html
Copyright © 2011-2022 走看看