判括號匹配(順序棧)
阿新 • • 發佈:2019-02-08
1.題目:
Problem Description
任意輸入一個由若干個圓括號、方括號和花括號組成的字串,設計一個演算法判斷該串中的括號是否配對。Input
有多組資料,每組為一個包含3類括號的字串,串長不超過100。Output
若該串中的括號匹配輸出1,否則輸出0。Sample Input
([{}])
([{}})
([{)]}
Sample Output
1
0
0
2.參考程式碼:
#include <iostream> #include <string.h> using namespace std; class SeqStack{ ///順序棧 private: char data[1111]; int top; public: SeqStack(){ top=-1; } ~SeqStack(){ } void Push(char x){ data[++top]=x; } char GetTop(){ return data[top]; } void Pop(){ if(top!=-1) top--; } bool empty(){ if(top==-1) return true; else return false; } }; int main() { char s[1111]; int i,len; while(gets(s)) { len=strlen(s); SeqStack w; for(i=0;i<len;i++) { if(s[i]=='(' || s[i]=='[' || s[i]=='{') w.Push(s[i]); ///若遇到左圓括號,左花括號,左方括號,則直接入棧 else if(s[i]==')') ///遇到右圓括號 { if(!w.empty()) ///若不為空 { if(w.GetTop()=='(') ///就判斷棧頂是否為左圓括號 w.Pop(); ///是的話,就將棧頂的左圓括號出棧 else w.Push(s[i]); ///否則當前元素入棧 } else w.Push(s[i]); ///當前元素入棧 } else if(s[i]=='}') ///遇到右花括號和上面的同理 { if(!w.empty()) { if(w.GetTop()=='{') w.Pop(); else w.Push(s[i]); } else w.Push(s[i]); } else if(s[i]==']') ///遇到右方括號和上面的同理 { if(!w.empty()) { if(w.GetTop()=='[') w.Pop(); else w.Push(s[i]); } else w.Push(s[i]); } } if(w.empty()) ///若遍歷完整個字串後,棧為空則說明匹配成功 cout<<1<<endl; else cout<<0<<endl; ///否則不成功 } return 0; }