解密回文——栈

一、关于栈的介绍

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

比如说有一个小桶,小桶的直径只能放一个小球,我们现在在小桶内依次放入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;
}

解密回文

     

时间: 2024-10-11 03:25:56

解密回文——栈的相关文章

栈浅析[解密回文]

栈的实现很简单,只需要一个一维数组和一个指向栈顶的变量top就可以了.我们通过top来对栈进行插入和删除操作. 栈究竟有哪些作用呢?我们来看一个例子."xyzyx"是一个回文字符串,所谓回文字符串就是指正读反读均相同的字符序列,如"席主席"."记书记"."aha"和"ahaha"均是回文,但"ahah"不是回文.通过栈这个数据结构我们将很容易判断一个字符串是否为回文. 如果一个字符串是回

回文---栈

/*栈的实现只需要一个一维数组和一个指向栈顶的变量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;//栈的初

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

算法中,队列是先进先出原则,而栈是后进先出原则,栈限定只能在一端进行插入和删除操作,而栈的作用有哪些? 可以通过一组回文字符串来看:"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

栈解决回文

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

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

回文判断

一个整形数是否是回文 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