nyoj 15-括號匹配(二) 模擬
阿新 • • 發佈:2018-12-24
題目描述:
給你一個字串,裡面只包含"(",")","[","]"四種符號,請問你需要至少新增多少個括號才能使這些括號匹配起來。
如:
[]是匹配的
([])[]是匹配的
((]是不匹配的
([)]是不匹配的
輸入描述:
第一行輸入一個正整數N,表示測試資料組數(N<=10) 每組測試資料都只有一行,是一個字串S,S中只包含以上所說的四種字元,S的長度不超過100
輸出描述:
對於每組測試資料都輸出一個正整數,表示最少需要新增的括號的數量。每組測試輸出佔一行
樣例輸入:
複製
4 [] ([])[] ((] ([)]
樣例輸出:
0 0 3 2
分好幾種情況。。。
模擬棧。。因為棧不能進行遍歷,所以需要陣列模擬。。。
1.如果為(或者[直接進入棧。。
2.如果為)或者]
(1)棧頂元素正好可以匹配時,則直接刪除棧頂元素。。。
(2)不匹配時,則從棧頂開始依次遍歷,直到找到匹配的位置,記下然後相當於將棧頂挪到了匹配的位置-1,然後記下之間的元素有多少個。。。
(3)如果(2)找不到元素,那直接答案+1。。。
程式碼如下:
#include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #include <stack> using namespace std; const int maxn=105; int n; char ss[maxn]; int ans; stack<char>s; struct List { int num; char a[maxn]; }; List L; void init() { ans=0; L.num=0; } int main() { scanf("%d",&n); while (n--) { init(); scanf("%s",ss); int len=strlen(ss); for (int i=0;i<len;i++) { if(ss[i]=='('||ss[i]=='[') { L.a[L.num++]=ss[i]; } else { if(ss[i]==')') { if(L.num&&L.a[L.num-1]=='(') L.num--; else { int flag=0,sum=0,num=L.num; while (num>=0) { if(L.a[num-1]=='(') { flag=1; L.num=num-1; break; } else sum++; num--; } if(flag) ans+=sum; else ans++; } } else if(ss[i]==']') { if(L.num&&L.a[L.num-1]=='[') { L.num--; } else { int flag=0,sum=0,num=L.num; while (num>=0) { if(L.a[num-1]=='[') { flag=1; L.num=num-1; break; } else sum++; num--; } if(flag) ans+=sum; else ans++; } } } } ans+=L.num; printf("%d\n",ans); } return 0; }