2021.1.19寒假打卡Day14
阿新 • • 發佈:2021-01-21
技術標籤:大一寒假打卡專用
P1241 括號序列
定義如下規則序列(字串):
-
空序列是規則序列;
-
如果S是規則序列,那麼(S)和[S]也是規則序列;
-
如果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;
}