原文地址: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;
}
