用栈解决括号匹配问题

数据结构中,栈的一个简单应用便是解决括号匹配的问题,我们的目的是输入一个字符串,输出匹配的括号和没有匹配的括号。
例如:
我们输入“(a+b)*(d+c)(” 这样一个字符串
输出结果为:
用栈解决括号匹配问题_第1张图片
代码如下:
首先建立栈的类

#include
#include
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 解决了问题

你可能感兴趣的:(c++,数据结构,栈,字符串)