今日栈x2 依旧当作笔记来写以防遗忘

#include

#include

using namespace std;

int main() {

string s;
while(cin>>s)
{
    int n=s.length(),i;
    stack<char>stk;
    if(n==1) cout<<s;
    else
    {
        for(i=0;i<n;i++)
        {
            if(stk.empty())//判断该元素入栈之前是不是空栈如果是就直接push
            {
                stk.push(s[i]);
            }
            else
            {
                if(s[i]==stk.top())//判断是不是与栈顶元素相同如果相同就需要分多情况
                {
                    if(s[i]=='o')//如果都是o就需要往后看栈顶下面的元素
                    {
                        stk.pop();//由于不能直接访问栈顶下面的元素需要先将栈顶弹出(本身也需要弹出栈顶替换或者消去)
                        if(stk.empty())//如果栈顶弹出后无元素了就直接合成大O
                        {
                            stk.push('O');
                        }
                        else//如果有元素(其实只能是大O,如果是小o早已与栈顶合成)
                        {
                            if(stk.top()=='O')//如果是O则会和栈顶、s[i]合成的大O相消
                            {
                                stk.pop();//故直接弹出
                            }
                        }
                    }
                    else//如果是大O直接消去即可
                    {
                        stk.pop();
                    }
                }
                else stk.push(s[i]);//不相同直接放后面就可以
            }
        }
        
        
        
        stack<char>stk1;//由于栈只能从栈顶取出与原字符串是反方向的,所以需要把它‘倒进’一个新的栈
        while(!stk.empty())
        {
            stk1.push(stk.top());//取一个
            stk.pop();//弹出一个
        }
        while(!stk1.empty())//从栈顶依次拿出
        {
            cout<<stk1.top();
            stk1.pop();
        }
    }
    cout<<endl;
}

}