洛谷-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;
}

posted @ 2025-03-17 21:43  夕瑶^  阅读(35)  评论(0)    收藏  举报