洛谷-P1241 括号序列
O(∩_∩)O哈哈~ 被自己蠢到啦 理解错题意了
注意:最近指的是离他最近的未匹配的的左括号 !!!、
额,本人还是不知道为啥错了,但没必要死死纠结,学一下新的思想吧!
错误代码:
//最近不是仅指他左边的那个邻居
#include<bits/stdc++.h>
using namespace std;
int main(){
stack<char> data;
stack<string> res;
char c,temp;
cin.get(c);
while(c!='\n'){
if (c == ')' || c == ']') {
if (!data.empty()) { // 先检查是否为空
temp = data.top();
if (c == ')' && temp == '(') {
res.push("()");
data.pop();
} else if (c == ']' && temp == '[') {
res.push("[]");
data.pop();
} else {
data.push(c);
}
} else {
data.push(c);
}
}
else{
data.push(c);
}
cin.get(c);
}
while(!data.empty()){
temp=data.top();
if(temp==')'||temp=='(') res.push("()");
if(temp==']'||temp=='[') res.push("[]");
data.pop();
}
while(!res.empty()){
cout<<res.top();
res.pop();
}
return 0;
}
思想
1、利用结构体存储字符及对应的下标
(可能是受上一题的影响,上来就想着按字符输入,此题可以直接读取字符串)
2、因为是右括号进行匹配,所以就只把左括号(左括号及对应的下标)放栈里就可以了。
3、3种情况
(1)栈为空,此时mark数组不变,跳过
(2)栈不空,能匹配,栈顶的pos和该i的mark值改为1,且将栈顶元素出栈
(3)栈不空,不能匹配,跳过
4、二次扫描字符串,根据mark值来输出
正确代码:
//利用栈、结构体和数组,进行二次扫描
#include<bits/stdc++.h>
using namespace std;
struct point{
char c;
// 该字符在字符串中的位置
int pos;
};
int main(){
// 标记该位是否可以匹配
char mark[101];
stack<point> p_s;
string s;
cin>>s;
for(int i=0;i<s.size();i++){
// 左括号入栈
if(s[i]=='['||s[i]=='('){
// 结构体入栈的方式
p_s.push({s[i],i});
continue;
}
// 栈为空,跳过
if (p_s.empty()) continue;
//右括号进行匹配
else{
// 如果栈不为空
if(!p_s.empty()) {
// 可以和栈顶元素匹配上,下标置为1
if(s[i]==')'&&p_s.top().c=='('||s[i]==']'&&p_s.top().c=='['){
mark[i]=1;
mark[p_s.top().pos]=1;
// 记得出栈,例([]]
p_s.pop();
}
}
}
}
for(int i=0;i<s.size();i++){
if(mark[i]==1) cout<<s[i];
else{
if(s[i]=='['||s[i]==']') cout<<"[]";
if(s[i]=='('||s[i]==')') cout<<"()";
}
}
return 0;
}

浙公网安备 33010602011771号