描述
回文序列是正反读均相同的字符序列,如“abba”和“abdba”均是回文,但是“good”不是回文。请设计一个算法判定给定的字符序列是否为回文。
输入
多组数据,每组数据有一行。每一行为一个长度不定的字符序列A。当A为“0”时,输入结束。
输出
对于每组数据输出一行。若字符序列A是回文序列,则输出“YES”,否则输出“NO”。
输入样例 1
abba
abdba
good
0
输出样例 1
YES YES NO
思路:
所谓回文字符串就是指把这个字符串倒过来还是和以前一样,比如“level”就是一个回文字符串~
采用两个栈,分别按正序和倒序存取字符串的每一位(注意string类型中,单独的每一个字符都是char类型,所以要用char类型的栈),都输入完毕以后再对其每个字符进行比较即可。
代码中,Empty函数判断当前的栈是否已空,Pop函数弹栈的同时,也返回弹出来的该字符。
代码如下:
#include<string>
#include<iostream>
#include<map>
#include<vector>
#include<cmath>
#include<set>
#include<algorithm>
using namespace std;
typedef struct Stack
{
char s;
struct Stack* next;
}*linkstack, SNode;
void Init(linkstack& s)
{
s = NULL;
}
void Insert(linkstack& l,char x)
{
linkstack p = new SNode;
p->s = x;
p->next = l;
l = p;
}
bool Empty(linkstack s)
{
if (s == NULL)
return true;
return false;
}
char Pop(linkstack& l)
{
if (l == NULL)
return 0;
linkstack p;
char e = l->s;
p = l;
l = l->next;
delete p;
return e;
}
void Compare(linkstack s1, linkstack s2)
{
while (!Empty(s1))
{
if (Pop(s1) != Pop(s2))
{
cout << "NO" << endl;
return;
}
}
cout << "YES" << endl;
}
int main()
{
string s;
cin >> s;
while (s != "0")
{
linkstack s1, s2;
Init(s1);
Init(s2);
for (int i = 0; i < s.length(); i++)
{
Insert(s1,s[i]);
//string的每一个字符都是单独的char
}
for (int i = s.length() - 1; i >= 0; i--)
Insert(s2, s[i]);
Compare(s1, s2);
cin >> s;
}
return 0;
}