1.问题描述
回文是指正读反读均相同的字符序列,如“abba”和“abdba”均是回文,但“good”不是回文。试写一个算法判定给定的字符向量是否为回文。(提示:将一半字符入栈)
2.题目分析
将字符串前一半入栈,然后,栈中元素和字符串后一半进行比较。即将第一个出栈元素和后一半串中第一个字符比较,若相等,则再出栈一个元素与后一个字符比较,……,直至栈空,结论为字符序列是回文。在出栈元素与串中字符比较不等时,结论字符序列不是回文。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define size 100
typedef struct
{
char data[size];
int top;
}seqstack;
seqstack *q;
void initstack() //置空
{
q->top=-1; //所有操作必须先置空
}
int stackempty() //判断是否为空
{
return q->top==-1;
}
int stackfull() //判断是否为满
{
return q->top==size-1;
}
int push(char x) //入栈
{
if(stackfull()) //自定义函数可以引用自定义函数 ,不需要通过实参输入;
{
puts("栈满\n");return 0; // 新大陆,直接输出字符串包括中文;
}
q->data[++q->top]=x;return 1; //栈的数组和栈的top ,先++在入
}
int pop(char *y) //出栈
{
if(stackempty())
{
puts("栈空");return 0;
}
*y=q->data[q->top--];return 1;
}
int sum(char ch[20])
{
initstack(); //先置空
int len,i;
char e;
len=strlen(ch);//判断数组长度
for(i=0;i<len/2;i++) //取一半入栈
if(push(ch[i]));
else
exit(0);//栈满退出
if(len%2==1)//如果输入的数为奇位数字,则跳过中间数字不进行比较,比如124跳过2。
i++;
while(!stackempty())
{
if(pop(&e));
else
exit(0);//栈满退出
if(ch[i]==e)//如果匹配相同,下一个继续比较
i++;
else
return 0;//不同返回0
}
return 1;//全部相同返回1
}
void main()
{
q=(seqstack *)malloc(sizeof(seqstack));
char ch[100];
gets(ch);
if(sum(ch))
printf("是回文数");
else
printf("不是回文数");
}
小伙伴们如果觉得文章对你有帮助的话,就小小的鼓励我一下点一个赞吧,谢谢大家啦!