1.问题描述
- 回文是指正读反读均相同的字符序列,如“abba”和“abdba”均是回文,但“good”不是回文。试写一个算法判定给定的字符向量是否为回文。(提示:将一半字符入栈)
2.题目分析
- 将字符串前一半入栈,然后,栈中元素和字符串后一半进行比较。即将第一个出栈元素和后一半串中第一个字符比较,若相等,则再出栈一个元素与后一个字符比较,……,直至栈空,结论为字符序列是回文。在出栈元素与串中字符比较不等时,结论字符序列不是回文。
3.代码实现
- main.cpp
#include <iostream>
#include <cstdlib>
#include <string>
#include <stack>
using namespace std;
int IsHuiWen2(string str)
{
stack<char> s;
int i, len;
char temp;
len = str.size(); // 求字符串长度
for (i = 0; i < len / 2; i++) // 将一半字符入栈
s.push(str[i]);
if (len % 2 == 0)
{
while (!s.empty())
{ // 每弹出一个字符与相应字符比较
temp = s.top();
s.pop();
if (temp != str[i])
return 0; // 不等则返回0
else
i++;
}
return 1; // 比较完毕均相等则返回1
}
else if (len % 2 != 0)
{
++i;
while (!s.empty())
{ // 每弹出一个字符与相应字符比较
temp = s.top();
s.pop();
if (temp != str[i])
return 0; // // 不等则返回0
else
i++;
}
return 1; // 比较完毕均相等则返回 1
}
}
int main()
{
string str;
cout<<"请输入字符串:";
getline(cin, str);
if (str.empty())
{
cout << "输入有误,请输入字符串:";
getline(cin, str);
}
if (IsHuiWen2(str))
{
printf("是回文字符串!\n");
}
else
{
printf("不是回文字符串!\n");
}
system("pause");
return 0;
}
- 运行结果