用链式栈实现括号匹配问题

用链式栈实现括号匹配问题

思路

逐个字符录入(循环实现),如果录入到左括号就压栈
如果录入到右括号就弹栈
此时有两种情况:
1、栈空 则括号不匹配
2、栈不空 则括号可能匹配
对于第二种情况我们又分点
设置一个bool类型的量,如果当前的右括号与栈中弹出的左括号不匹配,则该bool类型值为 0,不匹配 。
在循环结束后我们还需要判断左括号是否比右括号多,即判断栈是否为空,若不空,则不匹配 。

代码

头文件

#include<iostream>
using namespace std;

链式栈构建

template <class T>
class LStack;

template <class T>
class SLNode{
	friend class LStack<T>;
	private:
		T data;
		SLNode<T> * next;
};

template <class T>
class LStack{
	private:
		SLNode<T> * top;
	public:
		LStack();					//构造函数 
		~LStack();					//析构函数 
		void Clear();				//栈的清空 
		bool Pop(T &item);			//栈的弹出 
		bool Pop();
		bool Push(const T &item);	//栈的压入 
		bool Peek(T &item);			//访问栈顶元素 
		bool IsEmpty();				//是否栈空 
};

template <class T>
LStack<T>::LStack()
{
	top = NULL;
}

template <class T>
LStack<T>::~LStack()
{
	Clear();
}

template <class T>
void LStack<T>::Clear()
{
	while(top)
	{
		Pop();
	}
}

template <class T>
bool LStack<T>::Pop(T &item)
{
	SLNode<T> * q;
	if(top == NULL)
	{
		cout<<"栈空无法弹出"<<endl;
		return false;
	}
	q = top;
	item = top->data;
	top = top->next;
	delete q;
	return true;
}

template <class T>
bool LStack<T>::Pop()
{
	SLNode<T> * q;
	if(top == NULL)
	{
		cout<<"栈空无法弹出"<<endl;
		return false;
	}
	q = top;
	top = top->next;
	delete q;
	return true;
}

template <class T>
bool LStack<T>::Push(const T &item)
{
	SLNode<T> *s =new SLNode<T>;
	s->data = item;
	s->next = top;
	top = s;
	return true;
}

template <class T>
bool LStack<T>::Peek(T &item)
{
	if(top == NULL)
	{
		cout<<"栈空"<<endl;
		return false;
	}
	item = top->data;
	return true;
}

template <class T>
bool LStack<T>::IsEmpty()
{
	if(top == NULL)
		return true;
	else return false;
}

主函数

int main(int argc,char **argv)
{
	LStack<char>bracket;		//声明一个链式对象
	char read_in = cin.get();
	bool is_matched = true;
	while(is_matched && read_in != '\n')
	{
		if(read_in == '{'||read_in == '['||read_in == '(')//输入开括号,则将其压入栈
			bracket.Push(read_in);
		if(read_in == '}'||read_in == ']'||read_in == ')')//若输入关括号,则检测是否匹配
		{
			if(bracket.IsEmpty())
			{
				cout<<read_in<<"不匹配"<<endl;	
				is_matched = false;
				return 0;
			}
			char open_bracket;
			bracket.Pop(open_bracket);
			is_matched = (open_bracket == '(' && read_in == ')')
			||(open_bracket == '[' && read_in == ']' )
			||(open_bracket == '{' && read_in == '}');
			if(!is_matched)
			{
				cout<<"不匹配"<<read_in<<open_bracket<<endl;
				return 0;
			}		
		} 
		read_in = cin.get();
	}
	if(!bracket.IsEmpty())
	{
		cout<<"不匹配"<<endl;
		return 0;
	}
	cout<<"匹配成功"<<endl;
	return 0; 
}
  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值