平衡括号序列的定义
括号序列是由(与)构成的序列。平衡的括号序列要求(与)出现次数一样多,而且序列的每个前缀里(的出现次数不低于)的出现次数。
解法
首先创建一个栈,当遇见(时入栈,若遇见),则查看当前栈顶有没有(跟它匹配,若有则使(出栈,若没有则说明当前的 前缀出现(的出现次数低于)的出现次数的情况 直接输出Invalid,否则使(出栈,因为这里跟)抵消了。遍历完毕则说明该序列任意前缀里(的出现次数不低于)的出现次数,输出Valid。
当然了,最后还得判断一下栈是否为空(要不然给你(((((((,程序会算它对的)。
代码
#include <iostream>
#include <stack>
using namespace std;
int main() {
stack<char> pr;
string s;
cin >> s;
for (auto i: s) {
if (i == '(') pr.push('(');
else if (pr.top() != '(') {
puts("Invalid");
return 0;
} else pr.pop();
}
if (pr.empty()) puts("Valid");
else puts("Invalid");
return 0;
}
进阶版
这次还有[和]需要处理,办法如上:
首先创建一个栈,当遇见[时入栈,若遇见],则查看当前栈顶有没有[跟它匹配,若有则使[出栈,若没有则说明当前的 前缀出现[的出现次数低于]的出现次数的情况 直接输出Invalid,否则使[出栈,因为这里跟]抵消了。遍历完毕则说明该序列任意前缀里[的出现次数不低于]的出现次数,输出Valid。
代码:
#include <iostream>
#include <stack>
using namespace std;
int main() {
stack<char> pr;
string s;
cin >> s;
for (auto i: s) {
if (i == '(') pr.push('(');
else if (i == '[') pr.push('[');
else if (i == ')') {
if (pr.top() != '(') {
puts("Invalid");
return 0;
else pr.pop();
} else if (i == ']') {
if (pr.top() != '[') {
puts("Invalid");
return 0;
else pr.pop();
}
}
if (pr.empty()) puts("Valid");
else puts("Invalid");
return 0;
}

本文介绍了如何使用栈数据结构来检测平衡括号序列,包括()和[]。通过遍历输入序列,遇到开括号入栈,遇到闭括号时检查栈顶是否有对应的开括号。如果序列中括号匹配,最终栈应为空,否则为无效序列。
108

被折叠的 条评论
为什么被折叠?



