利用C++栈结构实现括号匹配算法

在C++中,可以使用栈(stack)数据结构来实现括号匹配的功能。括号匹配是一个常见的问题,主要用来检查字符串中的括号是否正确配对(例如大括号与大括号 {}、小括号与小括号 ()、尖括号与尖括号 <> 等)。

图片[1]_利用C++栈结构实现括号匹配算法_知途无界

下面是一个详细的代码示例和解释,展示了如何使用栈来实现括号匹配:

#include <iostream>
#include <stack>
#include <string>
#include <unordered_map>
using namespace std;
// 函数来检查括号是否匹配
bool isMatchingPair(char open, char close) {
unordered_map<char, char> matchPairs = {
{'(', ')'},
{'{', '}'},
{'<', '>'}
};
return matchPairs[open] == close;
}
// 函数来检查括号是否匹配
bool areBracketsBalanced(const string& expr) {
stack<char> s;
for (char ch : expr) {
// 如果是左括号,压入栈
if (ch == '(' || ch == '{' || ch == '<') {
s.push(ch);
}
// 如果是右括号,检查栈顶元素是否匹配
else if (ch == ')' || ch == '}' || ch == '>') {
// 如果栈为空,说明没有对应的左括号
if (s.empty()) {
return false;
}
// 弹出栈顶元素并检查是否匹配
char top = s.top();
s.pop();
if (!isMatchingPair(top, ch)) {
return false;
}
}
}
// 最后检查栈是否为空,如果为空则所有括号都匹配
return s.empty();
}
int main() {
string expr;
cout << "请输入一个包含括号的表达式: ";
getline(cin, expr);
if (areBracketsBalanced(expr)) {
cout << "括号匹配成功!" << endl;
} else {
cout << "括号匹配失败!" << endl;
}
return 0;
}
#include <iostream>
#include <stack>
#include <string>
#include <unordered_map>

using namespace std;

// 函数来检查括号是否匹配
bool isMatchingPair(char open, char close) {
    unordered_map<char, char> matchPairs = {
        {'(', ')'},
        {'{', '}'},
        {'<', '>'}
    };
    return matchPairs[open] == close;
}

// 函数来检查括号是否匹配
bool areBracketsBalanced(const string& expr) {
    stack<char> s;

    for (char ch : expr) {
        // 如果是左括号,压入栈
        if (ch == '(' || ch == '{' || ch == '<') {
            s.push(ch);
        }
        // 如果是右括号,检查栈顶元素是否匹配
        else if (ch == ')' || ch == '}' || ch == '>') {
            // 如果栈为空,说明没有对应的左括号
            if (s.empty()) {
                return false;
            }
            // 弹出栈顶元素并检查是否匹配
            char top = s.top();
            s.pop();
            if (!isMatchingPair(top, ch)) {
                return false;
            }
        }
    }

    // 最后检查栈是否为空,如果为空则所有括号都匹配
    return s.empty();
}

int main() {
    string expr;
    cout << "请输入一个包含括号的表达式: ";
    getline(cin, expr);

    if (areBracketsBalanced(expr)) {
        cout << "括号匹配成功!" << endl;
    } else {
        cout << "括号匹配失败!" << endl;
    }

    return 0;
}
#include <iostream> #include <stack> #include <string> #include <unordered_map> using namespace std; // 函数来检查括号是否匹配 bool isMatchingPair(char open, char close) { unordered_map<char, char> matchPairs = { {'(', ')'}, {'{', '}'}, {'<', '>'} }; return matchPairs[open] == close; } // 函数来检查括号是否匹配 bool areBracketsBalanced(const string& expr) { stack<char> s; for (char ch : expr) { // 如果是左括号,压入栈 if (ch == '(' || ch == '{' || ch == '<') { s.push(ch); } // 如果是右括号,检查栈顶元素是否匹配 else if (ch == ')' || ch == '}' || ch == '>') { // 如果栈为空,说明没有对应的左括号 if (s.empty()) { return false; } // 弹出栈顶元素并检查是否匹配 char top = s.top(); s.pop(); if (!isMatchingPair(top, ch)) { return false; } } } // 最后检查栈是否为空,如果为空则所有括号都匹配 return s.empty(); } int main() { string expr; cout << "请输入一个包含括号的表达式: "; getline(cin, expr); if (areBracketsBalanced(expr)) { cout << "括号匹配成功!" << endl; } else { cout << "括号匹配失败!" << endl; } return 0; }

代码详解

包含头文件

    #include <iostream>
    #include <stack>
    #include <string>
    #include <unordered_map>
    #include <iostream>
    #include <stack>
    #include <string>
    #include <unordered_map>
    #include <iostream> #include <stack> #include <string> #include <unordered_map>

    iostream 用于输入输出。

    stack 用于存储括号。

    string 用于处理字符串。

    unordered_map 用于存储括号匹配对。

    定义匹配函数

      bool isMatchingPair(char open, char close) {
      unordered_map<char, char> matchPairs = {
      {'(', ')'},
      {'{', '}'},
      {'<', '>'}
      };
      return matchPairs[open] == close;
      }
      bool isMatchingPair(char open, char close) {
          unordered_map<char, char> matchPairs = {
              {'(', ')'},
              {'{', '}'},
              {'<', '>'}
          };
          return matchPairs[open] == close;
      }
      bool isMatchingPair(char open, char close) { unordered_map<char, char> matchPairs = { {'(', ')'}, {'{', '}'}, {'<', '>'} }; return matchPairs[open] == close; }

      使用一个哈希表 unordered_map 来存储左括号和右括号的匹配关系。

      返回布尔值,表示两个括号是否匹配。

      定义括号匹配函数

        bool areBracketsBalanced(const string& expr) {
        stack<char> s;
        for (char ch : expr) {
        if (ch == '(' || ch == '{' || ch == '<') {
        s.push(ch);
        } else if (ch == ')' || ch == '}' || ch == '>') {
        if (s.empty()) {
        return false;
        }
        char top = s.top();
        s.pop();
        if (!isMatchingPair(top, ch)) {
        return false;
        }
        }
        }
        return s.empty();
        }
        bool areBracketsBalanced(const string& expr) {
            stack<char> s;
        
            for (char ch : expr) {
                if (ch == '(' || ch == '{' || ch == '<') {
                    s.push(ch);
                } else if (ch == ')' || ch == '}' || ch == '>') {
                    if (s.empty()) {
                        return false;
                    }
                    char top = s.top();
                    s.pop();
                    if (!isMatchingPair(top, ch)) {
                        return false;
                    }
                }
            }
        
            return s.empty();
        }
        bool areBracketsBalanced(const string& expr) { stack<char> s; for (char ch : expr) { if (ch == '(' || ch == '{' || ch == '<') { s.push(ch); } else if (ch == ')' || ch == '}' || ch == '>') { if (s.empty()) { return false; } char top = s.top(); s.pop(); if (!isMatchingPair(top, ch)) { return false; } } } return s.empty(); }
        1. 遍历字符串中的每个字符。
        2. 如果是左括号,则压入栈中。
        3. 如果是右括号,检查栈是否为空,如果为空则没有对应的左括号,返回 false
        4. 否则,弹出栈顶元素并检查是否与当前右括号匹配,如果不匹配则返回 false
        5. 最后检查栈是否为空,如果为空则所有括号都匹配,返回 true
        6. 主函数
        int main() {
        string expr;
        cout << "请输入一个包含括号的表达式: ";
        getline(cin, expr);
        if (areBracketsBalanced(expr)) {
        cout << "括号匹配成功!" << endl;
        } else {
        cout << "括号匹配失败!" << endl;
        }
        return 0;
        }
        int main() {
            string expr;
            cout << "请输入一个包含括号的表达式: ";
            getline(cin, expr);
        
            if (areBracketsBalanced(expr)) {
                cout << "括号匹配成功!" << endl;
            } else {
                cout << "括号匹配失败!" << endl;
            }
        
            return 0;
        }
        int main() { string expr; cout << "请输入一个包含括号的表达式: "; getline(cin, expr); if (areBracketsBalanced(expr)) { cout << "括号匹配成功!" << endl; } else { cout << "括号匹配失败!" << endl; } return 0; }
        1. 从用户输入读取包含括号的表达式。
        2. 调用 areBracketsBalanced 函数检查括号是否匹配,并输出结果。

        这段代码展示了如何使用栈数据结构来实现括号匹配,并提供了详细的注释和解释。希望这对你有所帮助!

        © 版权声明
        THE END
        喜欢就点个赞,支持一下吧!
        点赞47 分享
        No gall, no glory.
        不经磨炼,难现辉煌
        评论 抢沙发
        头像
        欢迎您留下评论!
        提交
        头像

        昵称

        取消
        昵称表情代码图片

          暂无评论内容