内容:
回文是只正读和返读都相同的字符序列,如“abba”和“abdba”均是回文,但“good”不是回文。试写一个算法判定给定的字符向量是否为回文。
步骤:
算法分析:
回文序列是正读和反读都相同的序列,就是比较一个序列和它的逆序列,而栈刚好具有先进后出,正序输入逆序输出的特点,因此我们可以利用栈来解决这个问题。
我们使用一个数组栈,把要进行判断的字符串进行取半入栈的操作,对其再进行出栈,这样输出的前半段序列是逆序的,只需要将其与剩余的未入栈的字符串序列进行比较,如果一一对应,则是回文序列。
代码如下:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef struct Stack //定义数组栈
{
int top;
char str[100];
}STACK;
int main()
{
int len,i,mid,next;
char str[100];
STACK s;
s.top=0;
gets(str); //输入字符串
len=strlen(str); //求字符串的长度
mid=len/2; //取字符串中间位置
for(i=0;i<mid;i++) //一半字符串入栈
{
s.str[s.top]=str[i];
s.top++;
}
if(len%2!=0) //字符串长度为奇数时,后半段字符串从中间位置+1开始
{
next=mid+1;
}else //否则,后半段字符串从中间位置开始
{
next=mid;
}
while(s.top!=0)
{
if(s.str[s.top-1]==str[next])//前半段的最后一个字符与后半段的第一个字符相等,继续比较
{
s.top--;
next++;
}
else
{
break;
}
}
if(s.top==0)
{
printf("是回文\n");
}
else
{
printf("不是回文\n");
}
return 0;
}
运行结果: