原文地址:http://www.cppblog.com/GUO/archive/2010/09/12/126483.html
/* 括號匹配問題,比較經典,利用堆棧來實現(摘自internet) 1. 括號匹配的四種可能性: ①左右括號配對次序不正確 ②右括號多於左括號 ③左括號多於右括號 ④左右括號匹配正確 2. 算法思想: 順序掃描算數表達式(表現為一個字符串),當遇到三種類型的左括號時候讓該括號進棧; 當掃描到某一種類型的右括號時,比較當前棧頂元素是否與之匹配,若匹配,退棧繼續判斷; 若當前棧頂元素與當前掃描的括號不匹配,則左右括號配對次序不正確; 若字符串當前為某種類型的右括號而堆棧已經空,則右括號多於左括號; 字符串循環掃描結束時,若堆棧非空(即堆棧尚有某種類型的左括號),則說明左括號多於右括號; 否則,括號配對正確。 3. 程序實現: */ #include <iostream> using namespace std; #define maxsize 100 struct sStack { char sign[maxsize]; int top; }; int InitsStack(sStack &SS) { SS.top=-1; return 1; } int IsEmptysStack(sStack &SS) { if(SS.top==-1) return 1; return 0; } int PushsStack(sStack &SS,char c) { SS.sign[++SS.top]=c; return 1; } int UpsStack(sStack &SS) { if(IsEmptysStack(SS)) { cout<<"棧空"<<endl; return 0; } SS.top--; return 1; } char TopsStack(sStack &SS) { if(IsEmptysStack (SS)) { cout <<"棧空"<<endl; return 0; } return SS.sign[SS.top]; } int main() { string s; cout<<"輸入表達式:"; cin>>s; int length=s.length(); int i; sStack SS; InitsStack(SS); for(i=0;i<length;++i) { if(s[i]=='('||s[i]=='['||s[i]=='{') PushsStack(SS,s[i]); else if(s[i]==')'&&!IsEmptysStack(SS)&&TopsStack(SS)=='(') UpsStack(SS); else if(s[i]==')'&&!IsEmptysStack(SS)&&TopsStack(SS)!='(') cout<<"括號匹配次序不正確"<<endl; else if(s[i]==']'&&!IsEmptysStack(SS)&&TopsStack(SS)=='[') UpsStack(SS); else if(s[i]==']'&&!IsEmptysStack(SS)&&TopsStack(SS)!='[') cout<<"括號匹配次序不正確"<<endl; else if(s[i]=='}'&&!IsEmptysStack(SS)&&TopsStack(SS)=='{') UpsStack(SS); else if(s[i]=='}'&&!IsEmptysStack(SS)&&TopsStack(SS)!='{') cout<<"括號匹配次序不正確"<<endl; else if((s[i]==')'||s[i]==']'||s[i]=='}')&&IsEmptysStack(SS)) cout<<"右括號多於左括號"<<endl; } if(!IsEmptysStack(SS)) cout<<"左括號多於右括號"<<endl; else if(i=(length-1)&&IsEmptysStack(SS)) cout<<"括號匹配正確"<<endl; system("PAUSE"); return 0; }