您的位置:首页 > 其它

用栈解决括号匹配问题

2020-04-06 07:16 447 查看

数据结构中,栈的一个简单应用便是解决括号匹配的问题,我们的目的是输入一个字符串,输出匹配的括号和没有匹配的括号。
例如:
我们输入“(a+b)*(d+c)(” 这样一个字符串
输出结果为:

代码如下:
首先建立栈的类

#include<iostream>
#include<string.h>
using namespace std;
const int stackIncreament=20;  //栈溢出时扩展空间的增量
class seqStack
{
public:
seqStack(int msize)
{
maxsize=msize;
elements =new int [maxsize];
top=-1; //要记得给top赋值
}
void Push(const int &x);  //x进栈
bool Pop(int &x);  //栈顶元素出展,由x返回
bool getTop(int &x) const ; //获取栈顶元素
int getsize() const {return top+1;}  //获取栈中元素个数
bool IsFull()  const
{
if(top==maxsize-1)  return true;
else return false;
}
bool IsEmpty() const   //必须声明为const,否则会报错
{
if(top==-1) return true;
else return false;
}
private:
int *elements;    //存放在栈中元素的栈数组
int top;            //栈顶指针
int maxsize;     //栈中最大可容纳元素的个数
void overflow();

};

void seqStack::overflow()
{
int *newarray=new int [maxsize+stackIncreament];
for(int i=0;i<maxsize;i++)
*(newarray+i)=*(elements+i);
maxsize=maxsize+stackIncreament;
delete []elements;
}
void seqStack::Push(const int &x)
{
if(IsFull()==true)  overflow();
else {
top++;
elements[top]=x;
}
}
bool seqStack::Pop( int &x)
{
if(IsEmpty()==true )  return false;
else
{
x=elements[top];
top--;
return true;
}
}
bool seqStack::getTop(int &x) const
{
if(IsEmpty()==true) return false;
else{
x=elements[top];
return true;
}
}

输入输出在主函数中进行

int main()
{
char s[100];
cin>>s;
int msize=20;
seqStack st(msize);
int len=strlen(s);
int i,j;
for(i=0;i<len;i++)
{
if(s[i]=='(')
{st.Push(i+1);  //把括号的位置放入栈中
}
else if(s[i]==')')
{
if(st.Pop(j)==true)
cout<<j<<"与"<<i+1<<"匹配"<<endl;
else cout<<"没有与第"<<i<<"个右括号匹配的左括号"<<endl;
}
}
while(st.IsEmpty()!=true){
st.Pop(j);
cout<<"没有与第"<<j<<"个左括号匹配的右括号!"<<endl;
}
return 0;
}

需要注意的几个地方:
1.top必须在构造函数中赋值,否则程序会出现难以预料的错误
2.IsFull()和IsEmpty()这两个函数必须声明为const类型的函数,否则会报错
这是在我编写代码过程中出现的错误,参考:https://blog.csdn.net/lixiaogang_theanswer/article/details/80920872 解决了问题

  • 点赞
  • 收藏
  • 分享
  • 文章举报
半城烟火、 发布了3 篇原创文章 · 获赞 0 · 访问量 71 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: