四月数据结构学习的相关点


利用栈的特性 来判断输入的是否是回文
/*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
");
return ERROR;
}
S->top++;
S->elem[S->top]=x;
return OK;
}
//出栈
int pop(SeqStack *S, DataType *x)
{
if(S->top==-1)
{
printf("empty
");
return ERROR;
}
*x=S->elem[S->top];
S->top--;
return OK;
}
//取栈顶元素
int getTop(SeqStack *S, DataType *x)
{
if(S->top==-1)
{
printf("empty
");
return ERROR;
}
*x=S->elem[S->top];
return OK;
}
int Palindromic(char str[])
{
SeqStack S;
initStack (&S);
int i;
for(i=0; str[i]!=' ' && str[i]!='@' && str[i]!='&'; i++)//将&符号之前的序列1入栈
push(&S, str[i]);
if(str[i]==' ' || str[i]=='@')//若没有&符号
{
printf("there is no &
");
return ERROR;
}
i++;//跳过&符号
for( ; str[i]!=' ' && str[i]!='@'; i++)//对&符号之后的序列2,按照字符一个一个进行操作
{
DataType x;
if(pop(&S, &x)==0)//将栈顶元素出栈,存储在x中,若栈为空,则说明序列2比序列1长,不是回文序列
{
printf("this is not a palindromic sequence.
");
return ERROR;
}
if(x!=str[i])//若序列1与序列2的字符不一样,则说明不是回文序列
{
printf("this is not a palindromic sequence.
");
return ERROR;
}
}
if(S.top!=-1)//若栈非空,则说明序列1比序列2长,不是回文序列
{
printf("this is not a palindromic sequence.
");
return ERROR;
}
printf("yes");
return OK;
}
void main()
{
char str[MAX];
gets_s(str);//读入字符序列
Palindromic(str);//回文判断
}