栈检测表达式中括号是否合法
假设某个字符串表达式允许包含两种括号:圆括号和方括号,其嵌套的顺序随意,判断该字符串表达式是否合法。嵌套格式: [([][])]
是正确的, 嵌套格式:[(](]]
是不正确的。
直接上一段代码(肯定不是最优解,只是提供一种思路)
#include <iostream>
#include <cstdio>
#include <stack>
#include <string>
using namespace std;
int main() {
string s, s_a;
stack<char> p;
cin >> s;
//栈顶的前一位
char fore;
int x = 0;
//将括号存入另一个字符串s_a。防止下方代码中if分支过多,过于深入
for (int i = 0; i < s.size(); ++i) {
if (s[i] == '(' || s[i] == ')' || s[i] == '[' || s[i] == ']') {
s_a[x++] = s[i];
}
}
for (int i = 0; i < x; ++i) {
//判断是否为空栈
if (p.empty()) {
//是空栈,将栈顶前一位重置,并压入括号
fore = '\0';
p.push(s_a[i]);
} else {
//不是空栈,记录当前栈顶再压入新元素
fore = p.top();
//压入栈顶之后,栈顶为当前的括号,fore为栈顶下方相邻元素
p.push(s_a[i]);
//判断是否成对
if ((fore == '(' && p.top() == ')') || (fore == '[' && p.top() == ']')) {
//若配对成功,则
p.pop();
p.pop();
if (p.empty()) fore = '\0';
else
fore = p.top();
}
}
}
//如果最后栈空,则证明所有的括号都已配对完成并弹出,表达式合法
if (p.empty()) cout << "Yes" << endl;
else cout << "No" << endl;
return 0;
}
大概的解释已经写在注释中,下边来几张图片辅助理解。
图是用ipad画完截图的(为了省事),希望不是很辣眼睛