C++ 使用堆栈解决回文匹配问题

题目:设称正读和反读都相同的字符序列为“回文”,例如,“abba“和“abccba”是“回文”,“abcde”和“ababab”则不是“回文“,试写一个算法,判别读入的一个以@为结束符的字符序列是否是“回文”。

主要思想:把前一半元素压入堆栈,后一半元素还存在string里,之后使用栈一个一个弹出进行匹配。

#include 
#include 
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;
}

你可能感兴趣的:(算法,c++,算法)