栈的应用_括号匹配

题目:括号涉及小括号(),中括号[],大括号{},我们要求给定的字符串中时候括号是匹配的。[] ([ )]这样不合法,{}[ ] {( {[ ]} )}是合法的。

解题思路:
核心是最近匹配,使用栈。

  • 如果是左边括号就进栈。
  • 如果是右边括号:先判断栈是否为空,然后查看栈顶元素pop()是否是匹配的左边括号。如果是,弹出pop().

三种括号代码雷同。

核心代码如下:

switch (brackets[i])
	{
		case '(':
			S.push(brackets[i]);//左括号入栈
			break;
		case ')'://右括号看栈顶元素是否匹配
			if (S.empty() || S.top() != '(')//短路表达式
				return false;
			S.pop();
			break;
	}

完整运行代码:

// validator_brackets.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
#include "pch.h"
#include <iostream>
#include<stack>
#include<string>
using namespace std;
//括号匹配
bool validator(const string &brackets)
{
	stack<char> S;
	for (size_t i = 0; i < brackets.size(); ++i)
	{
		cout << brackets[i] << " ";
		switch (brackets[i])
		{
		case '(':
			S.push(brackets[i]);
			break;
		case ')':
			if (S.empty() || S.top() != '(')//距离最近,并且使用短路表达式
				return false;
			S.pop();
			break;

		case '[':
			S.push(brackets[i]);
			break;
		case ']':
			if (S.empty() || S.top() != '[')
				return false;
			S.pop();
			break;
		case '{':
			S.push(brackets[i]);
			break;
		case '}':
			if (S.empty() || S.top() != '{')
				return false;
			S.pop();
			break;
		default: return false;//输入有误的情况
		}
	}
	return  S.empty();//如果是空(匹配成功),返回真;如果非空,返回false;

}

int main()
{
    std::cout << "Hello World!\n"; 
	string  brackets="(){[()]}";
	//cin >> brackets;
	cout << (validator(brackets) ? "括号成功匹配" : "括号不匹配或者输入有误") << endl;

}

学习:

  • 短路表达式
    if (S.empty() || S.top() != ‘[’) 如果栈S为空,直接跳过if语句,后面的S.top()!=’['不用看。

  • bool函数返回值的学习,结合栈的特性
    return S.empty();//如果是空(匹配成功),返回真;如果非空,返回false;

  • 条件运算符
    cout << (validator(brackets) ? “括号成功匹配” : “括号不匹配或者输入有误”) << endl;

发布了114 篇原创文章 · 获赞 70 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/shizheng_Li/article/details/104477636