用棧判斷表示式中的括號是否匹配
阿新 • • 發佈:2019-01-09
判斷表示式中的括號是否匹配
一.問題描述
給定一個算數表示式,算式中可能包括括號,括號的型別有大括號,小括號,中括號。輸入為字串型別,程式判斷
算式中的括號是否匹配。
二.問題分析
1.此題可用棧結構來解決。演算法的核心思想為:遇到一個左括號將此左括號入棧,遇到一個右括號時,出棧一個左括號。
2.當出現以下情況時,可判斷此表示式括號不匹配:①出棧的左括號與右括號型別不同,例 “{” 和“)”。②遇到右括號時,
棧中已沒有左括號③已到字串結尾,棧中還有左括號。
三.關鍵函式
Boolean check(char *s) { int i=0; STACK st; st=makeNull(st); while(s[i]!='\n'){ if(s[i]=='('||s[i]=='['||s[i]=='{'){//左括號入棧 push(st,s[i]); i++; } else{ if(st.size==0) return FALSE; else if(top(st)!=s[i]) return FALSE; else{ pop(st);//左右括號匹配 i++; } } } if(st.size!=0) return FALSE;//還有左括號,不匹配 return FALSE; }
四.完整程式
程式中給了棧的型,並給出了棧的一些基本操作。
/*十一、假設表示式中允許包含三種括號:圓括號、方括號和大括號。 設計一個演算法採用順序棧(用陣列表示的棧)判斷表示式中的括號是否正確配對。 要求: 1、定義棧以及棧的型,棧中所存放元素的型別為字元型,定義列舉型別Boolean,其中兩個元素分別為TRUE和FALSE。 2、定義棧的各種操作。 3、定義函式Boolean check(char *s); 判斷s中的括號是否正確配對,如果正確配對,返回TRUE,否則返回FALSE。 4、在主函式中驗證所編寫函式的正確性。 */ #include<iostream> #include<iomanip> #include<cmath> #include<cstdlib> #include<string> using namespace std; #define MAX 1000002 enum Boolean{//列舉變數Boolean TRUE, FALSE }; typedef char elementtype; struct STACK{ elementtype element[MAX]; int size; }; /*empty() 堆疊為空則返回真 pop() 移除棧頂元素 push() 在棧頂增加元素 size() 返回棧中元素數目 top() 返回棧頂元素 */ STACK makeNull(STACK &s)//將棧置空 { s.size=0; return s; } Boolean empty(STACK s) { if(s.size==0) return TRUE; return FALSE; } int size(STACK s) { return s.size; } elementtype top(STACK s) { if(s.size==0) exit(1); else return s.element[0]; } void push(STACK s,elementtype e) { if(s.size==0){ s.element[0]=e; s.size++; } else{ for(int i=s.size;i>0;i--){ s.element[i]=s.element[i-1]; } s.element[0]=e; s.size++; } } void pop(STACK s) { if(s.size==0) return; if(s.size==1){ s.size=0; return; } for(int i=0;i<s.size-1;i++){ s.element[i]=s.element[i+1]; } s.size--; } Boolean check(char *s) { int i=0; STACK st; st=makeNull(st); while(s[i]!='\n'){ if(s[i]=='('||s[i]=='['||s[i]=='{'){//左括號入棧 push(st,s[i]); i++; } else{ if(st.size==0) return FALSE; else if(top(st)!=s[i]) return FALSE; else{ pop(st);//左右括號匹配 i++; } } } if(st.size!=0) return FALSE;//還有左括號,不匹配 return FALSE; } int main() { return 0; }