您的位置:首页 > 其它

括号匹配问题--栈实现

2014-07-21 22:18 295 查看
转自:http://www.cppblog.com/GUO/archive/2010/09/12/126483.html

1.如果使用number计数的话,只能使用与单个括号匹配,对于多个括号不适用

2.括号不可是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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: