数据结构—栈运用之括号匹配检验(LeetCode 20)

1.案例分析

  • 检验算法借助一个栈,每当读入一个左括号,则直接入栈,等待相匹配的同类右括号;每当读入一个右括号,若与当前栈顶的左括号类型相同,则二者匹配,将栈顶的左括号出栈,直到表达式扫描完毕在处理过程中,还要考虑括号不匹配出错的情况。

2.算法步骤

  • ①初始化一个空栈S
  • ②设置一标记性变flag,用来标记匹配结果以控制循环及返回结果,1表示正确匹配,0表示错误匹配,fag初值为1。
    ③扫描表达式,依次读入字符ch,如果表达式没有扫描完毕或flag非零,则循环执行以下操作:
    • 若ch是左括号“[”或“(",则将其压入栈;
    • 若ch是右括号“)”,则根据当前栈顶元素的值分情况考虑:若栈非空且栈顶元素是“(”,则正确匹配,否则错误匹配,fag置为0;
    • 若ch是右括号“]”,则根据当前栈顶元素的值分情况考虑:若栈非空且栈顶元素是"[",则正确匹配,否则错误匹配,flag置为0。
  • ④退出循环后,如果栈空且fag值为1,则匹配成功,返回true,否则返回false

3.算法描述

bool Matching() 
{
	stack<char> s;  // 定义一个stack容器
	char ch, temp;
	int flag = 1;     // 标记匹配结果以控制循环及返回结果
	
	cin >> ch; //读入第一个字符

	while (ch != '#' && flag) //假设表达式以“#”结尾
	{
		switch (ch)
		{
			case '[':
			case '(':      // 若是左括号,则将其压入栈
				s.push(ch);
			break;
		
			case ')':  //若是“)”,则根据当前栈顶元素的值分情况考虑
				if (!s.empty() && s.top() == '(')  // 若栈非空且栈顶元素是“(”,则正确匹配
				{
					temp = s.top();
					s.pop();
				}		                           
				else
					flag = 0;    // 若栈空或栈顶元素不是“(”,则错误失败
			break;
		
			case ']': //若是“]”,则根据当前栈顶元素的值分情况考虑
				if (!s.empty() && s.top() == '[') // 若栈非空且栈顶元素是“[”,则正确匹配
				{
					temp = s.top();
					s.pop();
				}		                          
				else
					flag = 0;         //若栈空或栈顶元素不是“[”,则错误匹配
			break;
		} //switch
		cin >> ch; //继续读入下一个字符
	} //while
	if (s.empty() && flag)
		return true;         // 匹配成功
	else
		return false;      // 匹配失败
}

4.代码实现

  • main.cpp
#include <iostream>
#include <cstdlib>
#include <stack>

using namespace std;

bool Matching() 
{
	stack<char> s;  // 定义一个stack容器
	char ch, temp;
	int flag = 1;     // 标记匹配结果以控制循环及返回结果
	
	cin >> ch; //读入第一个字符

	while (ch != '#' && flag) //假设表达式以“#”结尾
	{
		switch (ch)
		{
			case '[':
			case '(':      // 若是左括号,则将其压入栈
				s.push(ch);
			break;
		
			case ')':  //若是“)”,则根据当前栈顶元素的值分情况考虑
				if (!s.empty() && s.top() == '(')  // 若栈非空且栈顶元素是“(”,则正确匹配
				{
					temp = s.top();
					s.pop();
				}		                           
				else
					flag = 0;    // 若栈空或栈顶元素不是“(”,则错误失败
			break;
		
			case ']': //若是“]”,则根据当前栈顶元素的值分情况考虑
				if (!s.empty() && s.top() == '[') // 若栈非空且栈顶元素是“[”,则正确匹配
				{
					temp = s.top();
					s.pop();
				}		                          
				else
					flag = 0;         //若栈空或栈顶元素不是“[”,则错误匹配
			break;
		} //switch
		cin >> ch; //继续读入下一个字符
	} //while
	if (s.empty() && flag)
		return true;         // 匹配成功
	else
		return false;      // 匹配失败
}

int main() 
{
	
	cout << "请输入待匹配的表达式,以“#”结束:" << endl;
	//int flag = (int)Matching();
	if (Matching())
		cout << "括号匹配成功!" << endl;
	else
		cout << "括号匹配失败!" << endl;
	
	system("pause");

	return 0;
}

Leetcode 20题代码

class Solution {
public:
	bool isValid(string s)
	{
		stack<char> S;  // 定义一个stack容器
		char temp;
		int flag = 1;
		int i = 0;// 标记匹配结果以控制循环及返回结果 

		while (s[i] != '\0'&& flag)
		{
			switch (s[i])
			{
			case '[':
			case '(':
			case '{':          // 若是左括号,则将其压入栈
				S.push(s[i]);
				break;

			case ')':  //若是“)”,则根据当前栈顶元素的值分情况考虑
				if (!S.empty() && S.top() == '(')  // 若栈非空且栈顶元素是“(”,则正确匹配
				{
					temp = S.top();
					S.pop();
				}
				else
					flag = 0;    // 若栈空或栈顶元素不是“(”,则错误失败
				break;

			case ']': //若是“]”,则根据当前栈顶元素的值分情况考虑
				if (!S.empty() && S.top() == '[') // 若栈非空且栈顶元素是“[”,则正确匹配
				{
					temp = S.top();
					S.pop();
				}
				else
					flag = 0;         //若栈空或栈顶元素不是“[”,则错误匹配
				break;

			case '}': //若是“]”,则根据当前栈顶元素的值分情况考虑
				if (!S.empty() && S.top() == '{') // 若栈非空且栈顶元素是“{”,则正确匹配
				{
					temp = S.top();
					S.pop();
				}
				else
					flag = 0;         //若栈空或栈顶元素不是“[”,则错误匹配
				break;

			} //switch
			i++;
		} //while
		if (S.empty() && flag)
			return true;         // 匹配成功
		else
			return false;      // 匹配失败
	}
};
  • 运行结果

  • 12
    点赞
  • 61
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值