数据结构与算法之括号匹配问题

        在各大公司的笔试题中,我们经常会遇到关于括号匹配的问题。其实匹配问题中主要运用到的数据结构就是栈,例如对一个字符串进的左右括号进行匹配,字符串(a*(b+c)+d)在位置0和位置3有左括号,在位置7和10有右括号,位置0的左括号与位置10的右括号相匹配,位置3左括号和位置7的右括号进行匹配。在字符串(d+f))( 中,位置5的左括号和位置6的右括号都没有与之相配的括号。在这种问题一般要求输入一个字符串,然后输出匹配的括号以及不匹配的括号。

       解题方法:通过观察字符串,我们可以发现,每一个右括号都会与最近的左括号进行匹配,当我们从左至右进行字符扫描的时候,遇到左括号的时候我们将左括号进行入栈操作。然而,当我们遇到一个右括号的时候,判断栈是否为空,如果栈为空说明没有相对应的左括号与之相匹配,这时我们输出没有匹配的右括号,然后继续上述操作。如果栈不为空的话,我们取出栈顶的左括号(并将该左括号从栈中删除)与扫描到的右括号进行匹配,输出匹配的括号,继续下一轮操作直至扫描完成。

      以下是具体的C++程序

void printMatchedPairs(string expr)
{
	arrayStack<char> s;
	
	int length = (int)expr.size();
	
	//扫描表达式expr 寻找左括号和右括号
	for(int i=0;i<length;i++)
	{
		if(expr.at(i) == '(')
		{
			s.push(expr.at(i))
		}
		else
		{
			if(expr.at(i) == ')')
			{
				try
				{
					cout<<s.top()<<' '<<i<<endl;   //取出栈顶的数据
					s.pop();                        //该数据出栈
				}
				catch(s.empty())                //若栈为空,说明该右括号没有被匹配
				{
					cout<<"该右括号没有与之匹配的左括号!"<<i<<endl;
				}
			}
		}
		//判断是否有剩下的左括号
		while(!s.empty())
		{
			cout<<"没有匹配的左括号"<<s.top()<<endl;
			s.pop();
		}
	}
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值