📌  相关文章
📜  在 C++ 中使用堆栈的括号检查器(1)

📅  最后修改于: 2023-12-03 14:50:52.082000             🧑  作者: Mango

在 C++ 中使用堆栈的括号检查器

括号检查器是一个经典的计算机程序,它的作用是检查一个给定的文本文件中的括号是否匹配。这是一个常见的问题,因为在编写代码时,经常会使用括号来表示代码块。如果括号不匹配,则可能会导致编译错误,甚至是运行时错误。

在本篇文章中,我们将介绍如何使用堆栈来实现一个简单的括号检查器。我们假设我们已经有一个包含括号的文本文件,并且希望检查其中的括号是否匹配。

堆栈的基础知识

堆栈是一种数据结构,它具有“先进后出”的特点。换句话说,最后一个放入堆栈的元素将是第一个被取出的元素。堆栈有两个基本操作——入栈和出栈:

  • 入栈:将一个元素添加到堆栈的顶部。这个元素被称为堆栈的“顶部元素”或“栈顶”。
  • 出栈:从堆栈的顶部删除一个元素。这个元素被称为“出栈元素”。

在 C++ 中,可以使用标准库中的 std::stack 类来表示堆栈。以下是一个示例代码:

#include <iostream>
#include <stack>

int main() {
    std::stack<int> s;
    s.push(1);
    s.push(2);
    s.push(3);
    while (!s.empty()) {
        std::cout << s.top() << '\n';
        s.pop();
    }
    return 0;
}

这个程序创建了一个 std::stack<int> 对象,并向其中添加了三个整数。然后,它一直从堆栈的顶部弹出元素,直到堆栈为空为止。输出将是:

3
2
1
实现括号检查器

现在我们已经了解了堆栈的基础知识,我们可以开始实现括号检查器。我们将使用一个堆栈来存储我们读取的括号。当发现一个左括号时,我们将其入栈,当发现一个右括号时,我们将尝试弹出栈顶元素来查看它是否匹配。如果匹配,我们继续读取下一个字符,如果不匹配,我们将报告一个错误。

以下是一个示例代码:

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

bool is_matching(char left, char right) {
    return (left == '(' && right == ')')
        || (left == '{' && right == '}')
        || (left == '[' && right == ']');
}

bool check_syntax(const std::string& s) {
    std::stack<char> stack;
    for (char c : s) {
        if (c == '(' || c == '{' || c == '[') {
            stack.push(c);
        } else if (c == ')' || c == '}' || c == ']') {
            if (stack.empty()) {
                return false;
            } else if (is_matching(stack.top(), c)) {
                stack.pop();
            } else {
                return false;
            }
        }
    }
    return stack.empty();
}

int main() {
    std::string input;
    std::cout << "Please enter a string: ";
    getline(std::cin, input);
    if (check_syntax(input)) {
        std::cout << "Syntax is correct!\n";
    } else {
        std::cout << "Syntax error!\n";
    }
    return 0;
}

在这个程序中,我们定义了一个 is_matching 函数来检查一个左括号和一个右括号是否匹配。我们使用一个 stack<char> 堆栈来存储我们读取的括号。在 check_syntax 函数中,我们遍历字符串中的每个字符,如果是左括号,我们将其推入堆栈中。如果是右括号,我们将尝试弹出堆栈的顶部元素并检查是否匹配。如果匹配,我们继续读取下一个字符,否则我们将报告一个错误。

总结

在本文中,我们已经介绍了如何使用堆栈来实现一个简单的括号检查器。我们使用 std::stack 类来表示堆栈,可以使用 pushpop 函数来添加和删除元素。根据示例代码,我们可以了解到如何检查括号是否匹配,以及如何在 C++ 中使用堆栈。堆栈是一种非常有用的数据结构,可以用于许多不同的程序中。