Leo的泡泡——算法笔记

题目描述:

Leo临近高考,为了缓解心情,她蹲在鱼缸旁看小鱼吐泡泡。
看了一段时间,她发现了一些规律:
小鱼每次会吐出一个小泡泡o或者大泡泡O,这些吐出来的泡泡会垂直往上升,两个相连的小泡泡会合在一起成为大泡泡,两个相连的大泡泡会合在一起炸开,也就是没有泡泡了。
小鱼每次都等上一次的泡泡合并完才会吐下一个泡泡,现在Leo给出她记录的小鱼吐泡泡的顺序,你能帮她计算最后的泡泡序列吗

输入:

数据有多组,处理到文件结束。
每组数据包含一行仅有’O’与’o’组成的字符串。每组数据长度不超过10008.

输出:

每组数据输出一行,输出一行字符串代表小鱼儿吐出的泡泡经过融合以后所剩余的泡泡。
(没有泡泡请输出空行)

样例输入:

ooOOoooO

样例输出:

oO
(从左到右进行合并)

这题显然要用到栈,当然,用其他容器也可以,只是用栈会比较方便。
基本思路:

  • 栈空的时候,把str[i]入栈;
  • 栈顶和 str[i] 相同时,先出栈顶元素(因为要改变),然后进行相应的处理。(这里有个细节处理,当 ‘o’ 相同时应注意栈里是否还有 ‘O’ )。
  • 栈顶元素和str[i]不相同时,也入栈str[i]。

参考代码:

#include<iostream>
#include<string>
#include<stack>
using namespace std;

int main()
{
    string str;
    while(cin>>str)
    {
        stack<char> paopao;
        for (int i = 0; i < str.size(); i++)
        {
            if (paopao.empty()) {       //如果栈为空,则入栈
                paopao.push(str[i]);
                continue;
            }
            if (paopao.top() == 'o' && str[i] == 'o')   //如果相同且是 'o'
            {
                paopao.pop();       //先出栈
                if ( ! paopao.empty() && paopao.top() == 'O') {   // 如果栈不为空(不为空一定要判定)且里面还有一个 'O'
                    paopao.pop();
                }
                else
                    paopao.push('O');
                continue;
            }
            if (paopao.top() == 'O' && str[i] == 'O')   //如果相同且都是 'O'
            {
                paopao.pop();
                continue;
            }
            if (paopao.top() != str[i]) {   //如果栈顶和 str[i] 不相同
                paopao.push(str[i]);
                continue;
            }

        }

        stack<char> print;      //定义输出栈
        while (! paopao.empty()){       //转移元素
            print.push(paopao.top());
            paopao.pop();
        }
        while (! print.empty()){    //输出
            cout<<print.top();
            print.pop();
        }
        cout<<endl;
    }

    return 0;
}

你可能感兴趣的:(算法笔记)