判断表达式中括号是否匹配(栈的典型应用)(某公司校园招聘笔试试题)

#include<iostream>
using namespace std;

typedef char Type;

typedef struct node
{
	Type data;
	struct node *next;
}Node, *Stack;

void initiateStack(Stack &s)
{
	s = new Node;
	s->next = NULL;
}

bool isEmptyStack(Stack &s)
{
	if(NULL == s)
	{
		cout << "栈不存在." << endl;
		exit(0);
	}

	if(NULL == s->next)
		return true;

	return false;
}

void push(Stack &s, Type element)
{
	Node *p = new Node;
	p->data = element;
	p->next = s->next;
	s->next = p;
}

Type pop(Stack &s)
{
	if(isEmptyStack(s))
	{
		exit(1);
	}

	Node *p = s->next;
	s->next = p->next;

	Type element = p->data;
	delete p;

	return element;
}

int getLength(Stack &s)
{
	Node *p = s;
	int length = 0;
	while(NULL != p->next)
	{
		p = p->next;
		length++;
	}

	return length;
}

Type getTop(Stack &s)
{
	if(isEmptyStack(s))
		exit(1);

	return s->next->data;
}

void clearStack(Stack &s)
{
	while(!isEmptyStack(s))
		pop(s);
}

void destoryStack(Stack &s)
{
	while(!isEmptyStack(s))
		pop(s);

	delete s;
	s = NULL;
}

//左右匹配
bool match(char c1, char c2)
{
	if( '(' == c1 && ')' == c2)
		return true;
	if( '[' == c1 && ']' == c2)
		return true;
	if( '{' == c1 && '}' == c2)
		return true;
	
	return false;
}

//左括号
bool isLeftBracket(char c)
{
	if('(' == c || '[' == c || '{' == c)
		return true;

	return false;
}

//右括号
bool isRightBracket(char c)
{
	if(')' == c || ']' == c || '}' == c)
		return true;

	return false;
}

//判断表达式中括号是否匹配
bool isExpressionLegal(char str[])
{
	Stack s;
	initiateStack(s);
	int i;
	for(i = 0; str[i]; i++)
	{
		if(isLeftBracket(str[i]))//遇到左括号,进栈
			push(s, str[i]);

		if(isRightBracket(str[i]))//遇到右括号,分情况讨论
		{
			if(isEmptyStack(s))
			{				
				destoryStack(s);
				return false;
			}

			if(!match(pop(s), str[i]))
			{
				destoryStack(s);
				return false;
			}
		}
	}

	if(!isEmptyStack(s))//栈中还有左括号
	{
		destoryStack(s);
		return false;
	}
	
	//如果不出现上面的情况,则必定是匹配的
	destoryStack(s);
	return true;

}

void print(bool b)
{
	if(b)
		cout << "yes" << endl;
	else
		cout << "no" << endl; 
}

int main()
{
	char str1[] = "(3 + 2)";
	print(isExpressionLegal(str1));

	char str2[] = "(3 + 2))";
	print(isExpressionLegal(str2));

	char str3[] = "((3 + 2)";
	print(isExpressionLegal(str3));

	char str4[] = "(3 + 2]";
	print(isExpressionLegal(str4));

	char str5[] = "{3 + 2]";
	print(isExpressionLegal(str5));

	char str6[] = "[3 + 2]";
	print(isExpressionLegal(str6));

	char str7[] = "[(3 + 2])";
	print(isExpressionLegal(str7));

	char str8[] = "5 * [(1 * {3 + 2}) * 4]";
	print(isExpressionLegal(str8));

	return 0;
}

 

 

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
可以使用判断表达式括号是否匹配。具体步骤如下: 1. 创建一个空。 2. 从左到右遍历表达式的每个字符。 3. 如果当前字符是左括号((、[、{),则将其压入。 4. 如果当前字符是右括号())、]、}),则进行如下操作: - 如果为空,则说明右括号多余,表达式括号不匹配。 - 如果不为空,则将顶元素弹出。 - 如果弹出的左括号与当前右括号不匹配,则表达式括号不匹配。 5. 如果表达式的所有字符都已遍历完毕,且为空,则表达式括号匹配;否则,表达式括号不匹配。 示例代码如下: ```python def is_bracket_match(expression): stack = [] for ch in expression: if ch in '([{': stack.append(ch) elif ch in ')]}': if not stack: return False left = stack.pop() if (left == '(' and ch != ')') or \ (left == '[' and ch != ']') or \ (left == '{' and ch != '}'): return False return not stack ``` 测试代码: ```python assert is_bracket_match('()') assert is_bracket_match('()[]{}') assert not is_bracket_match('(]') assert not is_bracket_match('([)]') assert not is_bracket_match('{[])(}') ``` 注意,上述代码只能判断表达式括号是否匹配,不能判断括号的嵌套关系是否正确,比如`[(])`这种表达式虽然括号数量相等,但是括号的嵌套关系不正确。如果需要判断括号的嵌套关系是否正确,可以使用递归的方法。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值