四月数据结构学习的相关点
利用栈的特性 来判断输入的是否是回文
/*SS 应用顺序栈实现回文(Palindromic Sequence)判断,具体如下: 试写一个算法,判断依次读入的一个以@为结束符的字母序列,是否为形如"序列1&序列2"模式的字符序列。 其中序列1和序列2中都不含字符"&",且序列2是序列1的逆序列。例如,"a+b&b+a"是属于该模式的字符序列, 而"1+3&3-1"则不是。 */ #include<stdio.h> #include<stdlib.h> #define ERROR 0 #define OK 1 #define MAX 100 //顺序栈的定义 typedef char DataType;//栈中的元素类型为char typedef struct LNode { DataType elem[MAX]; int top;//栈顶位置 }SeqStack; //基本操作 //栈的初始化 void initStack (SeqStack *S) { S->top=-1; } //进栈 int push(SeqStack *S, DataType x) { if(S->top==MAX-1) { printf("full\n"); return ERROR; } S->top++; S->elem[S->top]=x; return OK; } //出栈 int pop(SeqStack *S, DataType *x) { if(S->top==-1) { printf("empty\n"); return ERROR; } *x=S->elem[S->top]; S->top--; return OK; } //取栈顶元素 int getTop(SeqStack *S, DataType *x) { if(S->top==-1) { printf("empty\n"); return ERROR; } *x=S->elem[S->top]; return OK; } int Palindromic(char str[]) { SeqStack S; initStack (&S); int i; for(i=0; str[i]!=‘\0‘ && str[i]!=‘@‘ && str[i]!=‘&‘; i++)//将&符号之前的序列1入栈 push(&S, str[i]); if(str[i]==‘\0‘ || str[i]==‘@‘)//若没有&符号 { printf("there is no &\n"); return ERROR; } i++;//跳过&符号 for( ; str[i]!=‘\0‘ && str[i]!=‘@‘; i++)//对&符号之后的序列2,按照字符一个一个进行操作 { DataType x; if(pop(&S, &x)==0)//将栈顶元素出栈,存储在x中,若栈为空,则说明序列2比序列1长,不是回文序列 { printf("this is not a palindromic sequence.\n"); return ERROR; } if(x!=str[i])//若序列1与序列2的字符不一样,则说明不是回文序列 { printf("this is not a palindromic sequence.\n"); return ERROR; } } if(S.top!=-1)//若栈非空,则说明序列1比序列2长,不是回文序列 { printf("this is not a palindromic sequence.\n"); return ERROR; } printf("yes"); return OK; } void main() { char str[MAX]; gets_s(str);//读入字符序列 Palindromic(str);//回文判断 }
原文:https://www.cnblogs.com/whilom/p/12811629.html