回文判断
回文是指正读反读均相同的字符序列,如“abba”和“abdba”均是回文,但“good”不是回文。编写一个程序,使用栈判定给定的字符序列是否为回文。
输入格式:
输入待判断的字符序列,按回车键结束,字符序列长度<20。
输出格式:
若字符序列是回文,输出“YES”;否则,输出“NO”。
输入样例:
abdba
解题思路
首先,我们要明白堆栈是具有一定操作约束的线性表,它的特点是只能在一端(栈顶)做插入或者删除操作,即里面的元素遵循后入先出的规则。
这样,这道题的解题思路就有了。给我们一段回文数字,我们先按顺序把它们压入栈中,由于它取元素的顺序是后入先出的,我们再一个个把它们取出来,这时候取出的元素顺序刚好是原始数据的反序。我们只需要把从栈中取出的元素依次与原始序列对比,判断其是否一致,就能判断该字符序列是否是回文了。(提示:比较时我们只需要比较序列的一半就可以啦,相信爱观察的你已经发现了)
源代码
#include<stdio.h>
#define SIZE 20
typedef struct SNode *Stack;
typedef char ElemenType;
struct SNode{
ElemenType data;
Stack next;
};
Stack createStack(){
Stack s;
s=(Stack)malloc(sizeof(struct SNode));
s->next=NULL;
return s;
}
int isEmpty(Stack s){
return (s->next==NULL);
}
void Push(ElemenType item,Stack s){
Stack p;
p=(Stack)malloc(sizeof(struct SNode));
p->next=s->next;
s->next=p;
p->data=item;
}
ElemenType Pop(Stack s){
Stack p;
ElemenType top;
if(isEmpty(s)){
printf("栈为空!");
return NULL;
}else{
p=s->next;
s->next=p->next;
top=p->data;
free(p);
return top;
}
}
int main(){
Stack s;
int i,j;
ElemenType a[SIZE];
gets(a);
s=createStack();
for(i=0;a[i]!='\0';i++){
Push(a[i],s);
}
for(j=0;j<=i/2;j++){
if(a[j]!=Pop(s)){
printf("NO");
return 0;
}
}
printf("YES");
return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)