用栈实现回文字符串的判断
栈是一种后进先出的数据结构,它只能在一段进行插入和删除操作。
例如一个字符串"12321",像这种 ,无论正读反读均相同的字符序列,就叫做回文字符串。
首先,我们需要读取这行字符串,并求出字符串的长度。
char a[101];
int len;
gets(a);
len=strlen(a);
如果一个字符串是回文的话,那么它必须是中间对称的,我们需要求中点,即:
mid=len/2-1;
接下来将会涉及到栈的应用;
我们先将mid之前的字符全部入栈。因为这里的栈是用来存储字符的,所以这里用来实现栈的数组类型是 字符数组,即 char s[101]; 初始化栈的时候,我们只需要让 top=0;入栈的操作是 top++;s[top]=x; (此处假设需要入栈的字符变量需要存储在变量x中),简写形式就是 s[++top]=x。
现在我们将mid之前的字符一次全部入栈。
for(i=0;i<=mid;i++)
{
s[++top]=x;
}
接下来进入判断回文的关键步骤。将当前栈中的字符依次出栈,看看是否能与mid之后的字符一一匹配,如果都能匹配说明这个字符串是回文字符串,否则这个字符串就不是回文字符串。
for(i=mid+1;i<=len-1;i++)
{
if(a[i] != s[top])
{
break;
}
top--;
}
if(top==0)
printf("yes!\n");
else
printf("no!\n");
最后如果top的值为0,就说明栈内所有的字符都被一一匹配了,那么这个字符串就是回文字符串。
完整代码如下:
代码一:
#include<stdio.h>
#include<string.h>
int main()
{
char a[101],s[101];
int i,len,mid,next,top;
gets(a); //字符串的读入
len=strlen(a); //求字符串的长度
mid=len/2-1; //求字符串的中点
top=0; //栈的初始化
for(i=0;i<=mid;i++) //将mid之前的字符依次入栈
{
s[++top]=a[i];
}
//判断字符串的长度是奇数还是偶数,并找出需要进行字符匹配的起始下标
if(len%2==0)
{
next=mid+1;
}
else
{
next=mid+2;
}
//匹配开始
for(i=next;i<=len-1;i++)
{
if(a[i] != s[top])
{
break;
}
top--;
}
//如果top的值为0,说明栈内的所有的字符都被一一匹配了
if(top==0)
printf("yes!\n");
else
printf("no!\n");
getchar();
getchar();
return 0;
}
代码二:
#include<stdio.h>
#include<string.h>
#include<malloc.h>
#define maxsize 50
typedef char datatype;
typedef int status;
typedef struct{
datatype data[maxsize];
int top;
}stack;
void newstack(stack *S) //初始化顺序栈
{
S=(stack*)malloc(sizeof(stack));
S->top==-1;
}
status push(stack*S,datatype e) //入栈
{
if(S->top==maxsize-1)
return 0;
else
{
S->top++;
S->data[S->top]=e;
return 1;
}
}
status pop(stack *S,datatype *e) //出栈
{
if(S->top==-1)
return 0;
else
{
*e=S->data[S->top];
S->top--;
return *e;
}
}
//主函数
int main()
{
stack S;
newstack(&S);
datatype a[100];
int length,i,next;
datatype e;
gets(a);
int mid;
length=strlen(a);
mid=length/2-1;
for(i=0;i<=mid;i++)
{
push(&S,a[i]);
}
if(length%2==0)
{
next=mid+1;
}
else
{
next=mid+2;
}
for(i=next;i<=length-1;i++)
{
pop(&S,&e);
if(e!=a[i])
{
printf("No!\n");
return 0;
}
}
printf("yes!\n");
return 0;
}