栈应用:括号匹配问题

问题:假设一个算法表达式种包含圆括号、方括号、花括号三种类型的括号,编写一个函数,用来判断表达式种的括号是否正确配对。

算法思想:

在算术表达式中,右括号和左括号的匹配次序正好符合后到的括号要最先被匹配的“后进先出”堆栈操作特定,因此可借助栈来操作。遇到左括号就入栈,遇到右括号就看是否匹配,匹配的话出栈并且继续往后进行。
括号匹配有以下四种情况
1.左右括号匹配次序不正确
2.右括号多于左括号
3.左括号多于右括号
4.括号匹配正确

具体方法看代码:

#include<iostream>
#include<cstring>
#include<stack>		//可以自己写跟栈相关的函数,为图方便,我用了c++的stack容器
using namespace std;
bool ExpIsCorrect(char* exp)	//判断字符串的左右括号是否匹配正确
{
	stack<char> myStack;
	int n = strlen(exp);
	int i = 0;
	while (i < n)
	{
		//exp[i]是止char*的当前字符
		if (exp[i] == '(' || exp[i] == '[' || exp[i] == '{')
			myStack.push(exp[i]);	 //左括号全部进栈
		/*若当前右括号与栈顶匹配则出栈*/
		else if (exp[i] == ')' && !myStack.empty() && myStack.top() == '(')
			myStack.pop();	
		else if (exp[i] == ']' && !myStack.empty() && myStack.top() == '[')
			myStack.pop();
		else if (exp[i] == '}' && !myStack.empty() && myStack.top() == '{')
			myStack.pop();
		/*若当前右括号与栈顶不匹配则次序错误*/
		else if (exp[i] == ')' && !myStack.empty() && myStack.top() != '(')
		{
			cout << "括号配对次序错误" << endl;
			return false;
		}
		else if (exp[i] == ']' && !myStack.empty() && myStack.top() != '[')
		{
			cout << "括号配对次序错误" << endl;
			return false;
		}
		else if (exp[i] == '}' && !myStack.empty() && myStack.top() != '{')
		{
			cout << "括号配对次序错误" << endl;
			return false;
		}
		/*若当前仍有右括号,而栈已空*/
		else if ((exp[i] == '}' || exp[i] == ')' || exp[i] == ']') && myStack.empty())
		{
			cout << "右括号多于左括号" << endl;
			return false;
		}
		i++;
	}
	/*若当前以无括号,而栈非空*/
	if (!myStack.empty()) {
		cout << "左括号多于右括号" << endl;
		return false;
	}
	return true;
}
int main()
{
	char s1[] = "(())abc{[(])}";
	char s2[] = "(()))abc{[]()}";
	char s3[] = "(()()abc{[]}";
	char s4[] = "(())abc{[]}";
	if (ExpIsCorrect(s1))cout << "左右括号正确配对" << endl;
	if (ExpIsCorrect(s2))cout << "左右括号正确配对" << endl;
	if (ExpIsCorrect(s3))cout << "左右括号正确配对" << endl;
	if (ExpIsCorrect(s4))cout << "左右括号正确配对" << endl;
	return 0;
}

在这里插入图片描述

发布了24 篇原创文章 · 获赞 11 · 访问量 5363

猜你喜欢

转载自blog.csdn.net/weixin_44339734/article/details/98185735