判断字符串是否为回文(C语言 顺序栈)
Posted 凌桓丶
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了判断字符串是否为回文(C语言 顺序栈)相关的知识,希望对你有一定的参考价值。
首先我们需要确定思路,如何用栈来判断字符串是否为回文。
1.栈是先进后出
2.回文是指正读反读均相同的字符序列
从这两点很容易就可以联想到一个方法,我们先将字符串全部存进去栈中,再将它全部出栈,进行对比,如果完全相同则为回文,这是一个简单并且直接的方法,但是还有没有方法可以优化呢?
我们可以可以通过回文的性质联想到先将一般的字符串存进去,出栈后再与剩下的一般进行比较,完全相同则为回文,这样的算法比起刚才的效率高了一倍。
明确了思路就可以开始写算法了
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define StackSize 100 //假定预分配的栈空间最多为100个元素
typedef char DataType;//假定栈元素的数据类型为字符
typedef struct
DataType data[StackSize];
int top;
SeqStack;
void Init(SeqStack *&s)
s=(SeqStack *)malloc(sizeof(SeqStack));
s->top=-1;
//初始化栈
void push(SeqStack *s,DataType e)
if( s->top == StackSize )
printf("栈满\\n");
else
s->top++;
s->data[s->top]=e;
//入栈
DataType pop(SeqStack *s)
if( s->top == -1 )
printf("栈空\\n");
return '\\0';
return (s->data[s->top--]);
//出栈
int main()
SeqStack *s;
int i=0,length,mid,flag=1;
char str[StackSize],y,z;
printf("请输入需要判断回文的字符串:\\n");
gets(str);
length = strlen(str);
mid = length/2-1;
//mid为字符串中间字符的下标
Init(s);
for( i=0; i<length/2; i++)
push(s,str[i]);
//入栈
if( length%2 != 0 )
mid += 1;
//判断字符串长度是奇数还是偶数,当为奇数时从中间下一个开始比较
for( i=1; i<=length/2; i++)
if( str[mid+i] == pop(s) )
flag = 1;
else
flag = 0;
break;
if( flag == 1 )
printf("该字符串为回文\\n");
else
printf("该字符串不是回文");
return 0;
因为我们先存进去一半的字符串,但如果字符串长度为奇数,既有一个字符仅仅出现过一次时,我们可以跳过它,与出栈数据与它后边的字符进行比较,当完全相同时,即为回文
以上是关于判断字符串是否为回文(C语言 顺序栈)的主要内容,如果未能解决你的问题,请参考以下文章
用递归判断字符串是不是为回文串(C语言) 用递归判断字符串是不是为回文串(C语言)