平衡括号序列的定义
括号序列是由(
与)
构成的序列。平衡的括号序列要求(
与)
出现次数一样多,而且序列的每个前缀里(
的出现次数不低于)
的出现次数。
解法
首先创建一个栈,当遇见(
时入栈,若遇见)
,则查看当前栈顶有没有(
跟它匹配,若有则使(
出栈,若没有则说明当前的 前缀出现(
的出现次数低于)
的出现次数的情况 直接输出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;
}