括号匹配问题--栈实现
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;
}
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;
}
相关文章推荐
- 链栈的简单实现及括号匹配问题的链栈解决方法
- JS简单实现括号匹配问题
- 动态栈的实现,括号匹配问题,逆波兰表达式
- java利用栈实现括号()[]匹配问题
- 括号匹配问题——用栈实现
- 栈之括号匹配问题(java实现)
- ACM括号匹配问题(java实现)
- 括号匹配问题 栈的应用 C语言实现
- 括号匹配问题——用栈实现
- 数据结构作业 栈 实现 括号匹配 问题
- 用栈实现括号匹配问题
- 括号匹配问题,用栈实现
- 数据结构(18)栈典型问题之C++实现括号匹配
- 数据结构课程设计:括号匹配问题(实现检验匹配并输出不匹配的位置)
- Python实现求解括号匹配问题的方法
- Java实现用栈判断括号匹配问题
- JS简单实现括号匹配问题
- 括号匹配问题——用栈实现
- 括号匹配问题(顺序栈实现)
- 用栈来实现括号匹配问题