题解 | 吐泡泡

吐泡泡

https://www.nowcoder.com/practice/f86fa2221c094b3d8d1fc79bae450d96

#include <bits/stdc++.h>
using namespace std;

int main() {
    int t;
    cin >> t;
    while (t--) {
        stack<char> st;
        string s;
        cin >> s;

        for (int i = 0; i < s.size(); i++) {
            if (s[i] == 'o') { // 处理小泡泡o
                if (st.empty()) {
                    st.push(s[i]);
                } else {
                    if (st.top() == 'o') {
                        // 第一步:弹出原来的o(两个o要合并)
                        st.pop();
                        // 关键修复:先判断栈是否为空,再访问st.top()
                        if (!st.empty() && st.top() == 'O') {
                            st.pop(); // 合并后的O和栈顶O抵消
                        } else {
                            st.push('O'); // 栈空/栈顶不是O,合并后的O入栈
                        }
                    } else {
                        // 栈顶是O,直接入栈o
                        st.push(s[i]);
                    }
                }
            } else { // 处理大泡泡O
                if (st.empty()) {
                    st.push(s[i]);
                } else {
                    if (st.top() == 'O') {
                        st.pop(); // 两个O抵消
                    } else {
                        st.push(s[i]); // 栈顶是o,直接入栈O
                    }
                }
            }
        }

        // 反转栈,保证输出顺序正确
        stack<char> ss;
        while (!st.empty()) {
            ss.push(st.top());
            st.pop();
        }
        // 输出结果
        while (!ss.empty()) {
            cout << ss.top();
            ss.pop();
        }
        cout << endl;
    }
    return 0;
}

全部评论

相关推荐

评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务