📅  最后修改于: 2023-12-03 15:42:17.569000             🧑  作者: Mango
本题是一道经典的栈应用题目。给定一个字符序列,其中只包含三种字符:'('、')'、'['和']',请编写一个函数,判断该序列是否合法,即每个左括号都有与之匹配的右括号,并且括号的嵌套顺序正确。
例如,序列"()"、"()[]"、"{[()]}"都是合法的,而序列"[)()]"、"()[{}]"则不合法。
以下是题目要求的C++代码片段:
bool isValid(string s) {
stack<char> st;
for (char c : s) {
if (c == '(' || c == '[' || c == '{') {
st.push(c);
} else {
if (st.empty()) {
return false;
}
char t = st.top();
st.pop();
if ((c == ')' && t != '(') || (c == ']' && t != '[') || (c == '}' && t != '{')) {
return false;
}
}
}
return st.empty();
}
以上代码定义了一个bool类型的函数isValid
,该函数接收一个字符串参数s
,使用了STL库中的stack
类型,实现了括号序列是否合法的判断。函数首先判断左括号是否出现,若出现,则入栈;接着,若右括号出现,则与栈顶元素匹配,若匹配,则栈顶元素弹出,否则返回false;最后,如果栈为空,则表示括号序列合法,返回true,否则返回false。
注意事项:
这道题不能使用硬编码。当输入括号匹配顺序变化时,不需要修改代码,只需修改输入的字符串,即能正确地得到输出结果。
这道题还可以使用其他数据结构来实现,例如递归、数组等,但基于stack的实现具有时间和空间的优势。