题解 | 吐泡泡
吐泡泡
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;
}