1. 程式人生 > 其它 >2021.1.19寒假打卡Day14

2021.1.19寒假打卡Day14

技術標籤:大一寒假打卡專用

P1241 括號序列

定義如下規則序列(字串):

  1. 空序列是規則序列;

  2. 如果S是規則序列,那麼(S)和[S]也是規則序列;

  3. 如果A和B都是規則序列,那麼AB也是規則序列。

例如,下面的字串都是規則序列:
()[](())([])()[]()[()]

而以下幾個則不是:
([])(())([()[email protected]

現在,給你一些由()[]構成的序列,你要做的,是補全該括號序列,即掃描一遍原序列,對每一個右括號,找到在它左邊最靠近它的左括號匹配,如果沒有就放棄。在以這種方式把原序列匹配完成後,把剩下的未匹配的括號補全。

輸入格式
輸入檔案僅一行,全部由()[]組成,沒有其他字元,長度不超過100。

輸出格式
輸出檔案也僅有一行,全部由()[]組成,沒有其他字元,把你補全後的規則序列輸出即可。

輸入輸出樣例
輸入

([()

輸出

()[]()

說明/提示
將前兩個左括號補全即可。

標記法

#include <iostream>
#include <string>
using namespace std;

int a[105]; //記錄是否配對

int main(){
    int i,j,len;
    string s;
    cin>>s;
    len=
s.length(); for (i=0; i<len; i++) { if (s[i] == ')') for (j=i-1;j>=0;j--) if (s[j]=='(' && a[j]==0){ a[i]=a[j]=1; break; } else if (s[i]==']') for (j=i-1;j>=0;j--) if
(s[j]=='[' && a[j]==0){ a[i]=a[j]=1; break; } } for (i=0;i<len;i++){ if(a[i]==0) if (s[i]=='(' || s[i]==')') cout<<"()"; else cout<<"[]"; else cout<<s[i]; } return 0; }

STL大法

#include <iostream>
#include <string>
#include <stack> 
using namespace std;

int main(){
	stack<int> q;
	string s,b;
    cin>>s;
    int len=s.size();
    
    for (int i=0;i<len;i++)	//匹配 
        if (s[i]=='('){
		   q.push(i);
		   b[i]=')';
		   
		}else if (s[i]=='['){
		   q.push(i);
		   b[i]=']';
		   
		}else{
            if (q.empty()||b[q.top()]!=s[i])
                if (s[i]==')') b[i]='('; 
				else b[i]='[';
				
            else b[q.top()]=' ',q.pop();
    	}
    	
    for (int i=0;i<len;i++){
        if (b[i]=='('||b[i]=='[') cout<<b[i];
        
        cout<<s[i];
        
        if (b[i]==')'||b[i]==']') cout<<b[i];
    }
    cout<<endl;
}