今日栈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;
}
}