数据结构初学之栈的应用--判断一个数学表达式的括号是否匹配

对于一个合法的数学表达式来说,其中的各大小括号"{", “}”, “[”. “]”, “(”, ")"应该是相互匹配的,输入算法对以字符串形式读入的表达式S,判断其中的各括号是否是匹配的。

ps: 判断一个数学表达式的括号是否匹配,不仅要判断其左右大小括号的数量是否对应相等,还要判断括号的匹配次序是否正确。

算法思想: 顺序扫描算数表达式(表现为一个字符串),当遇到三种类型的左括号时候,执行进栈操作;当扫描到某一种类型的右括号时,比较当前栈顶元素是否与之匹配,若匹配,出栈一次并继续判断;若当前栈顶元素与当前扫描的括号不匹配,则左右括号配对次序不正确;若字符串当前为某种类型的右括号而栈已经空,则右括号多于左括号;字符串循环扫描结束时,若栈非空(即堆栈尚有某种类型的左括号),则说明左括号多于右括号;否则,括号配对正确。

//判断一个数学表达式是否合法
bool bracketMatch2(string str) {
	seqStack S;//定义一个栈
	initialStack(S);//初始化
	int len = str.length();//获得数学表达式的长度
	bool tag = true;
	bool result;
	int i = 0;
	elementType x;
	while (i < len && tag == true) {
		switch (str[i]) {
		//所有左括号入栈
		case '(':
		case '[':
		case '{':
			if (!stackFull(S))
				pushStack(S, str[i]);
			break;
		case ')':
			//扫描到右括号时,如果当前栈空,右括号多于左括号
			if (stackEmpty(S)) {
				tag = false;
				result = false;
				break;
			}
			//得到栈顶元素,并出栈
			popStack(S, x);
			if(x == '(') {
				break;
			}
			//匹配次序不正确
			else {
				tag = false;
				result = false;
				break;
			}
		case ']':
			if (stackEmpty(S)) {
				tag = false;
				result = false;
				break;
			}
			popStack(S, x);
			if (x == '[') {
				break;
			}
			else {
				tag = false;
				result = false;
				break;
			}
		case '}':
			if (stackEmpty(S)) {
				tag = false;
				result = false;
				break;
			}
			popStack(S, x);
			if (x == '{') {
				break;
			}
			else {
				tag = false;
				result = false;
				break;
			}
		default:
			break;
		}

		i++;
	}
	if (tag == true) {
		result = true;
	}
	else {
		result = false;
	}
	return result;
}
  • 3
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值