回文判断 (用堆栈的解法)
题目:回文是指正读反读均相同的字符序列,如“abba”和“abdba”均是回文,但“good”不是回文。编写一个程序,使用栈判定给定的字符序列是否为回文。
输入格式:
输入待判断的字符序列,按回车键结束,字符序列长度<20。
输出格式:
输入待判断的字符序列,按回车键结束,字符序列长度<20。
输入样例:
abdba
输出样例:
YES
#include <iostream> // 或直接使用万能头文件
#include <stack> // #include <bits/stdc++.h>
#include <string>
using namespace std;
int main()
{
string s;
getline(cin, s); // 输入一行待判断的字符串
stack<char> c_stack; // 定义一个char类型的堆栈
int i;
for (i = 0; i < s.size() / 2; i++)
c_stack.push(s[i]); // 将字符串前半部分压入堆栈
int start_matching = 0; // start_matching:开始匹配的位置
if (s.size() % 2 == 0)
start_matching = s.size() / 2;
else
start_matching = s.size() / 2 + 1;
for (i = start_matching; i < s.size(); i++)
{
if (c_stack.top() == s[i])
c_stack.pop();
else if (c_stack.top() != s[i] && !c_stack.empty())
{
cout << "NO";
return 0;
}
}
/* 例
a b d b a
0 1 2 3 4
5 5/2 = 2
首先:压栈 a b
然后:start_matching = s.size() + 1
即从下标3开始匹配, 栈顶元素为 b
判断: 如果栈顶等于 s[i] 就弹栈
如果不等于,直接结束
*/
if (c_stack.empty()) // 如果栈中没有元素,则为回文
cout << "YES";
else
cout << "NO";
return 0;
}