题目:括号涉及小括号(),中括号[],大括号{},我们要求给定的字符串中时候括号是匹配的。[] ([ )]这样不合法,{}[ ] {( {[ ]} )}是合法的。
解题思路:
核心是最近匹配,使用栈。
- 如果是左边括号就进栈。
- 如果是右边括号:先判断栈是否为空,然后查看栈顶元素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;