62 lines
2.0 KiB
C++
62 lines
2.0 KiB
C++
// 【场景】栈应用
|
||
// 编写一个程序,判断给定的字符串是否是有效的括号序列。例如,对于字符串 "{[()]}",应返回 true;对于字符串 "{[(])}",应返回 false。
|
||
// 【提示】华为OD的机试题
|
||
#include <iostream>
|
||
#include <stack>
|
||
#include <string>
|
||
|
||
using namespace std;
|
||
|
||
bool judge(const string &str)
|
||
{
|
||
stack<char> stk;
|
||
int max_depth = 0;
|
||
|
||
for (char c : str) // 增强型 for 循环,用于遍历字符串
|
||
{
|
||
if (c == '(' || c == '[' || c == '{')
|
||
{
|
||
stk.push(c); // 当左括号出现时,入栈
|
||
}
|
||
else if (c == ')' || c == ']' || c == '}') // 当碰到右括号时,开始匹配
|
||
{
|
||
if (stk.empty()) // 如果栈已经为空,说明没有左括号与之匹配
|
||
{
|
||
return false; // 返回无法匹配
|
||
}
|
||
|
||
char top = stk.top(); // 拿出栈顶元素
|
||
|
||
if (max_depth < stk.size())
|
||
max_depth = stk.size();
|
||
|
||
stk.pop(); // 弹出栈顶元素
|
||
|
||
// 判断本次取出的字符与栈顶元素是否匹配,即左右括号是否匹配,不匹配则返回无效,匹配则继续进行下一轮遍历循环
|
||
if ((c == ')' && top != '(') || (c == ']' && top != '[') || (c == '}' && top != '{'))
|
||
{
|
||
return false; // 括号不匹配
|
||
}
|
||
}
|
||
}
|
||
|
||
cout << "括号栈的最大深度为: " << max_depth << endl;
|
||
return stk.empty(); // 栈为空表示括号完全匹配 = 有效 = true = 1,反之,如果栈非空,说明还有未匹配的左括号,返回无效 = false = 0
|
||
}
|
||
|
||
string print(bool flag)
|
||
{
|
||
if (flag) // flag 为 true = 1
|
||
return "有效";
|
||
else
|
||
return "无效";
|
||
}
|
||
|
||
int main()
|
||
{
|
||
// string str1 = "{[(])}";
|
||
// string str1 = "{(])}";
|
||
string str1 = "{[(s[s])s]}[][[[[()]]]]";
|
||
cout << "括号序列 " << str1 << " 是否有效: " << print(judge(str1)) << endl; // 1
|
||
return 0;
|
||
} |