📜  门| GATE-CS-2015(Set 1)|问题12(1)

📅  最后修改于: 2023-12-03 15:42:17.569000             🧑  作者: Mango

介绍题目12:判断括号序列是否合法

本题是一道经典的栈应用题目。给定一个字符序列,其中只包含三种字符:'('、')'、'['和']',请编写一个函数,判断该序列是否合法,即每个左括号都有与之匹配的右括号,并且括号的嵌套顺序正确。

例如,序列"()"、"()[]"、"{[()]}"都是合法的,而序列"[)()]"、"()[{}]"则不合法。

以下是题目要求的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。

注意事项:

  1. 这道题不能使用硬编码。当输入括号匹配顺序变化时,不需要修改代码,只需修改输入的字符串,即能正确地得到输出结果。

  2. 这道题还可以使用其他数据结构来实现,例如递归、数组等,但基于stack的实现具有时间和空间的优势。