P1241 括号序列 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
这道题倒是对于栈有感觉了
一开始确实也是因为题意理解错了,花了点时间
一开始的想法:左括号入栈left,us存未配对成功的,配对成功就输出
果不其然想的太简单了,错的花花绿绿的
#include <iostream> #include <stack> #include <string> using namespace std; stack<char> leftk, us; int main() { string a; cin >> a; for(int i = 0; i < a.size(); i ++ ) { if(a[i] == '(' || a[i] == '[') { leftk.push(a[i]); us.push(a[i]); } if(a[i] == ')') { if(leftk.top() == '(') { leftk.pop(); us.pop(); cout << "()"; } else { us.push(')'); } } if(a[i] == ']') { if(leftk.top() == '[') { leftk.pop(); us.pop(); cout << "[]"; } else { us.push(']'); } } } while(!us.empty()) { char t = us.top(); us.pop(); if(t == '(' || t == ')') cout << "()"; else cout << "[]"; } return 0; }
然后又读了一边题:想了想数据,一测试发现不是这样的,得按原来的顺序分别输出配对的,和未配对的
懂了然后
思路就是还是将左括号入栈,但是要一起将坐标入栈,用st数组来标记是配对成功了还是不成功
栈就是用来辅助判断是否配对的
我还犯了个小错误就是,RE了好多点,一搜发现是在栈那里,得确定非栈空才能取顶和pop()
#include <iostream>
#include <stack>
#include <string>
using namespace std;
stack<char> leftk, leftp;
bool st[110];
int main()
{
string a;
cin >> a;
for(int i = 0; i < a.size(); i ++ )
{
if(a[i] == '(' || a[i] == '[')
{
leftk.push(a[i]);
leftp.push(i);
}
if(a[i] == ')')
{
if(!leftk.empty() && leftk.top() == '(')
{
leftk.pop();
int pos = leftp.top();
leftp.pop();
st[i] = true;
st[pos] = true;
}
}
if(a[i] == ']')
{
if(!leftk.empty() && leftk.top() == '[')
{
leftk.pop();
int pos = leftp.top();
leftp.pop();
st[pos] = true;
st[i] = true;
}
}
}
for(int i = 0; i < a.size(); i ++ )
{
if(st[i])
{
cout << a[i];
}
else
{
if(a[i] == '(' || a[i] == ')') cout << "()";
else cout << "[]";
}
}
return 0;
}