利用Stack类判断一个字符串是否为回文
【提示】回文字符串是一种关于字符串中心对称的特殊字符串,如果将字符串从中间划分为两个字符串,则只需要将其中一个字符串逆序,其结果与另外一个字符串是相等的。显然,回文字符串的判断中一个重要的操作是将字符串逆序,该操作可以利用栈的LIFO特性轻松实现。 将一半字符串压栈,然后依次弹出,依次和另一半字符串的每个字符比较,如果不同,返回false;如果栈为空,返回true。
LIOF:Last In First Out.
【题解代码】
//使用堆栈判断回文
#include<iostream>
const int MAX_SIZE=100;
using namespace std;
class Stack
{
private:
char *data;
int size;
int top;
public:
Stack()
{
top=-1;
size=MAX_SIZE;
data=new char[size];
}
Stack(int s)
{
top=-1;
size=s;
data=new char[size];
}
~Stack()
{
delete [] data;
}
void Push(char c)
{
if(!isFull())
data[++top]=c;
else
cout<<"堆栈已满,不能压入"<<endl;
}
void Pop()
{
if(!isEmpty())
top--;
else
cout<<"堆栈为空,不能弹出"<<endl;
}
char getTop()
{
if(!isEmpty())
return data[top];
else
return 0;
}
bool isEmpty()
{
if(top==-1)
return true;
else
return false;
}
bool isFull()
{
if(top==MAX_SIZE-1)
return true;
else
return false;
}
};
int main()
{
Stack P;
int flag=0;
cout<<"请输入要判断的字符串:"<<endl;
string s; //输入字符串
cin>>s;
int len=s.size();
int len1;
if(len==1)
{
cout<<"Yes"<<endl;
return 0;
}
else
{
for(int i=0;i<len/2;i++) //压入一半字符
{
P.Push(s[i]);
}
if(len%2==1)
len1=len+1;
else
len1=len; //这段代码是为了保证从后半段字符与前半段对称的地方开始比较
for(int i=len1/2;i<len;i++)
{
char ch=P.getTop();
if(ch==s[i])
flag=1;
else
flag=0;
P.Pop();
}
if(flag)
cout<<"Yes"<<endl;
else
cout<<"No"<<endl;
}
return 0;
}