千家信息网

C语言怎么用顺序栈实现回文序列判断

发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,这篇文章将为大家详细讲解有关C语言怎么用顺序栈实现回文序列判断,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。我是采用了两个栈值得比较大小判断得(可能比较浪费空间但是
千家信息网最后更新 2026年11月01日C语言怎么用顺序栈实现回文序列判断

这篇文章将为大家详细讲解有关C语言怎么用顺序栈实现回文序列判断,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

我是采用了两个栈值得比较大小判断得(可能比较浪费空间但是代码我感觉简单一点)

首先是定义一个栈的结构元素,由于是字符串类型就直接定义一个char的数组就可以:.

typedef struct stack{    char data[MAX_SIZE];      //储存字符串//     int top;                  //记录栈顶// }SeqStack;

下来就是初始化,我这里是用的耿国华老师的方法就直接给一个top元素指向栈顶,传入的指针地址:.

void Initstack(SeqStack *S)   //初始化栈,让top指向栈顶// {        S->top=-1;}

下面就是创建顺序栈了,元素只要没满就一直可以入住:

int Push(SeqStack *S,char x)  //压栈,只要top小于MAX_SIZE-1就可以继续入栈// {        if(S->top<=MAX_SIZE-1)        {        S->top++;        S->data[S->top]=x;    }else{            return -1;;        }}

下面是核心函数,操作实现回文序列的判断,我注释的比较清楚直接看就可以了:

void Pop(SeqStack *S)        //出栈操作,也是最主要的操作// {        SeqStack *p;                               p=(SeqStack*)malloc(sizeof(SeqStack));  //建立一个新的空栈,由于是指针类型要分配动态地址//        Initstack(p);                           //给新的栈进行初始化//         int i=S->top/2;                         //i用来分割两个字符串,将第二个字符串赋给新的空栈//         int j=i-1;                              //j用来记录除了@之外的其他字符数量大小//         while(S->top!=i)                        //开始对空栈进行赋值,对原来的栈开始清空(清空一般大小)//         {                p->top++;                p->data[p->top]=S->data[S->top];                S->top--;    }    S->top=S->top-2;                        //让原来的栈直接指向数字,跨过了字符@//     for(int k=0;kdata[S->top]==p->data[p->top])  //由于栈的特点先进后出,所以新栈的存储顺序和去掉@字符之后的旧栈的存储顺序是一样的,所以这里直接比较//             {                    j--;                             //j是定义需要比较字符的大小,只要两个栈的元素ASCLL相等j就减一,如果全部相等j为0,该字符串就是互为回文序列//                 }                S->top--;                            //两个top指针向下值//             p->top--;                if(j==0)                         //判断//                 {                        printf("两个字符串互为回文序列!");                }        }        if(j!=0)        {                printf("两个字符串不互为回文序列!");        }        free(p);                       //free掉分配的空间// }

下面附上整个代码:

#include#include#define MAX_SIZE 100typedef struct stack{    char data[MAX_SIZE];      //储存字符串//     int top;                  //记录栈顶// }SeqStack;void Initstack(SeqStack *S)   //初始化栈,让top指向栈顶// {        S->top=-1;}int Push(SeqStack *S,char x)  //压栈,只要top小于MAX_SIZE-1就可以继续入栈// {        if(S->top<=MAX_SIZE-1)        {        S->top++;        S->data[S->top]=x;    }else{            return -1;;        }}void Pop(SeqStack *S)        //出栈操作,也是最主要的操作// {        SeqStack *p;                               p=(SeqStack*)malloc(sizeof(SeqStack));  //建立一个新的空栈,由于是指针类型要分配动态地址//        Initstack(p);                           //给新的栈进行初始化//         int i=S->top/2;                         //i用来分割两个字符串,将第二个字符串赋给新的空栈//         int j=i-1;                              //j用来记录除了@之外的其他字符数量大小//         while(S->top!=i)                        //开始对空栈进行赋值,对原来的栈开始清空(清空一般大小)//         {                p->top++;                p->data[p->top]=S->data[S->top];                S->top--;    }    S->top=S->top-2;                        //让原来的栈直接指向数字,跨过了字符@//     for(int k=0;kdata[S->top]==p->data[p->top])  //由于栈的特点先进后出,所以新栈的存储顺序和去掉@字符之后的旧栈的存储顺序是一样的,所以这里直接比较//             {                    j--;                             //j是定义需要比较字符的大小,只要两个栈的元素ASCLL相等j就减一,如果全部相等j为0,该字符串就是互为回文序列//                 }                S->top--;                            //两个top指针向下值//             p->top--;                if(j==0)                         //判断//                 {                        printf("两个字符串互为回文序列!");                }        }        if(j!=0)        {                printf("两个字符串不互为回文序列!");        }        free(p);                       //free掉分配的空间// }int main(){        SeqStack S;        char x;        int m=0;        Initstack(&S);        printf("请输入第一串字符\n");        while(m!=2)                            //因为只需要输入两个字符串的判断,判断条件为m!=2//         {            scanf("%c",&x);            if(x=='@')                           //输入@后表明第一个字符串结束//             {                    m++;                if(m==1)                {                        printf("请输入第二串字符:\n");               }            }       Push(&S,x);    }    Pop(&S);        return 0;}

下面加一个例子:

判断3+1与1+3是否为回文序列

关于"C语言怎么用顺序栈实现回文序列判断"这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

字符 字符串 两个 回文 序列 顺序 大小 元素 指向 指针 就是 分配 存储 输入 地址 空间 篇文章 类型 语言 代码 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 互联网佳科技有限公司 北京路客互联网科技有限公司 中国互联网科技工作委员会毛军 科技信息互联网 科技类互联网 喔噻互联网科技 大白互联网科技 互联网金融和金融科技 深圳卡尔迅互联网科技有限公司怎么样 互联网金融科技公司干啥的 贵州叶脉互联网科技有限公司所属行业 江阴互联网智能科技产品进口 互联网科技研发水平 皮皮虾互联网科技有限公司 城市宝互联网科技有限公司 南京一网一红互联网科技有限公司 互联网科技包装股 互联网硬科技公司 数字互联网科技有限公司 10位科技互联网大佬 互联网公司 科技公司 上海互联网科技有限公司 善班互联网科技有限公司 北京大学互联网科技怎么样 恒银科技与互联网金融 重庆威客帮互联网科技 哈尔滨屹滨互联网科技有限公司 美国互联网科技实力 互联网对科技影响 互联网大会出现的黑科技
0