题目:设称正读和反读都相同的字符序列为“回文”,例如,“abba“和“abccba”是“回文”,“abcde”和“ababab”则不是“回文“,试写一个算法,判别读入的一个以@为结束符的字符序列是否是“回文”。
主要思想:把前一半元素压入堆栈,后一半元素还存在string里,之后使用栈一个一个弹出进行匹配。
#include <iostream>
#include <stack>
using namespace std;int main()
{stack <char> stk; //直接使用C++高级API创建一个字符堆栈string a;cout<<"input a string:";int len = 0;int mid = 0;int flg = 1;char e;cin>>e;while(e!='@') //遇到 @ 停止输入{a += e;cin>>e;}len = a.length();cout<<"len = "<<len<<endl;mid = len/2; //获得中点的index,奇偶后面再讨论for(int i=0; i<mid; i++) //将终点前所有元素压入堆栈{stk.push(a[i]);}if(len%2 != 0) //判断奇偶,若为奇,则从中点的下一个节点开始匹配,若为偶则不变,很好理解{mid = mid+1;}for(int i=mid; i<len; i++) //进行匹配,top返回栈最上面的元素{cout<<stk.top()<<"--"<<a[i]<<endl;if(stk.top()!=a[i]){cout<<"不是回文"<<endl;flg = 0;break;}stk.pop(); //将最上面的元素弹出}if(flg == 1){cout<<"是回文"<<endl;}return 0;
}