题目描述
给出一个长度不超过1000的字符串,判断它是不是回文(顺读,逆读均相同)的。
输入描述:
输入包括一行字符串,其长度不超过1000。
输出描述:
可能有多组测试数据,对于每组数据,如果是回文字符串则输出"Yes!”,否则输出"No!"。
输入示例
hellolleh helloworld
输出示例
Yes! No!
C语言用堆栈来求回文字符串的代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXSIZE 100
typedef struct {
char a[MAXSIZE];
int top;
} SeqStack;
SeqStack *Init_stack() { //置空栈
SeqStack *s;
s=(SeqStack*)malloc(sizeof(SeqStack)); //申请栈的空间
s->top=-1; //初始化栈顶指针
return s;
}
int Empty_Stack(SeqStack *s) { //判断是否为空栈
if(s->top==-1) return 1;
else return 0;
}
int Push_Stack(SeqStack *s,char x) { //入栈
if(s->top==MAXSIZE-1) return 0; //栈满不能入栈
else {
s->top++;
s->a[s->top]=x;
return 1;
}
}
int Pop_Stack(SeqStack *s,char *x) { //出栈
if(Empty_Stack(s)) return 0; //栈空不能出栈
else {
*x=s->a[s->top]; //更新栈顶指针
s->top--;
return 1; //栈顶元素存入*x,返回
}
}
int Top_Stack(SeqStack *s,char *x) { //取栈顶元素
if(Empty_Stack(s)) return 0; //栈空无元素
else {
*x=s->a[s->top];
return 1;
}
}
int main() {
char a[100];
gets(a);
int len=strlen(a);
SeqStack *s;
s = Init_stack();
char *ch;
int flag=1; //flag用来判断是否为回文字符
for(int i=0; i<len/2; i++) {
Push_Stack(s,a[i]); //把前一半的元素入栈
}
for(int i=(int)(len/2.0+0.5); i<len; i++) {
if(Pop_Stack(s,ch)) {
if(*ch!=a[i]) {
flag = 0; //不是回文字符
}
}
}
if(flag==1)
printf("Yes!");
else
printf("No!");
}
C++用堆栈的话可以直接调用<stack>这个库
#include <bits/stdc++.h>
#include <stack>
using namespace std;
int main()
{
string s;
getline(cin,s);
int len = s.length();
stack<char> T;
bool flag = true; //flag用来判断是否为回文字符
for(int i=0; i<len/2; i++)
{
T.push(s[i]); //把前一半的元素入栈
}
for(int i=(int)(len/2.0+0.5); i<len; i++)
{
if(!T.empty())
{
if(T.top()!=s[i]) //判断是否与栈顶元素相等
{
flag = false; //不是回文字符
}
T.pop(); //删除栈顶元素
}
}
if(flag)
{
cout << "Yes!" << endl;
}
else
{
cout << "No!" << endl;
}
}