栈是一种后进先出的数据结构。栈限定位只能在一端进行插入和删除操作。
比如,浏览网页的时候需要回退到之前的某个网页,我们需要一步步地点击后退键。
下面我们将用栈的数据结构判断一个字符串是否为回文。
“xyzyx”是一个回文字符串,所谓回文字符串就是指正读反读均相同的字符序列,如“席主席”、“记书记”、“aha”和“ahaha”均是回文,但“ahah”不是回文。输入一行字符(仅包含小写英文字母a~z)请判断这行字符串是否为回文。
输入格式:
只有一行,仅包含小写英文字母a~z的字符串,长度小于等于100。
输出格式:
只有一行,如果是回文请输出YES,不是回文则输出NO,请注意大小写。
样例 1 :
输入:
ahah
输出:
NO
样例 2 :
输入:
ahaha
输出:
YES
#include <stdio.h>
#include <string.h>
int main()
{
char stack[101];//创建一个栈结构
int next;
char str[101];//创建一个存字符串数组
int top = -1;//设置一个头指针
scanf("%s",str);
int len = strlen(str);
int mid = len/2-1;//取字符串的一半
for(int i=0;i<=mid;i++)//把字符串的一半存入栈中
{
stack[++top]=str[i];
}
if(len%2==0)//如果是偶数,就紧挨mid比较
{
next=mid+1;
}
else//如果是奇数,就要隔去最中间的字符,然后再比较
{
next=mid+2;
}
for(int i=next;i<len;i++)//一位一位的比较
{
if(str[i]!=stack[top])
{
break;
}
else
{
top--;
}
}
if(top==-1)
{
printf("YES\n");
}
else
{
printf("NO\n");
}
}
运行结果:
haha
NO
下面是使用结构体实现的栈,和这个题没有关系,仅供参考
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <malloc.h>
struct Stack//定义一个栈
{
int base;
int top;
int maxsize;
int *elem;
};
void init(Stack &stack)//初始化,并且分配一定的内存空间
{
stack.elem = (int*)malloc(sizeof(int)*101);
stack.maxsize=101;
stack.base=0;
stack.top=0;
}
void pop(Stack &stack)//出栈
{
stack.top--;
}
void push(Stack &stack,int elem)//入栈
{
stack.elem[stack.top]=elem;
stack.top++;
}
void show(Stack &stack)//输出栈
{
while(stack.top!=0)
{
stack.top--;
printf("%d\n",stack.elem[stack.top]);
}
}
int main()
{
struct Stack stack;//定义一个栈
init(stack);//初始化栈
push(stack,1);//把1入栈
push(stack,2);//把2入栈
push(stack,3);//把3入栈
show(stack);//输出栈里面的元素
return 0;
}
运行结果:
3
2
1