📅  最后修改于: 2023-12-03 14:50:52.082000             🧑  作者: Mango
括号检查器是一个经典的计算机程序,它的作用是检查一个给定的文本文件中的括号是否匹配。这是一个常见的问题,因为在编写代码时,经常会使用括号来表示代码块。如果括号不匹配,则可能会导致编译错误,甚至是运行时错误。
在本篇文章中,我们将介绍如何使用堆栈来实现一个简单的括号检查器。我们假设我们已经有一个包含括号的文本文件,并且希望检查其中的括号是否匹配。
堆栈是一种数据结构,它具有“先进后出”的特点。换句话说,最后一个放入堆栈的元素将是第一个被取出的元素。堆栈有两个基本操作——入栈和出栈:
在 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
类来表示堆栈,可以使用 push
和 pop
函数来添加和删除元素。根据示例代码,我们可以了解到如何检查括号是否匹配,以及如何在 C++ 中使用堆栈。堆栈是一种非常有用的数据结构,可以用于许多不同的程序中。