2.利用链式栈实现,给定一串字符,不超过100个字符,可能包括括号、数字、字母、标点符号、空格,编程检查这一串字符中的( ) ,[ ],{ }是否匹配。测试数据有多组,处理到输入结束。C++
时间: 2024-11-22 22:36:39 浏览: 19
python专题——正则表达式借鉴.pdf
要使用链式栈(也称为双向链表)来检查括号匹配,你可以创建一个结构体来表示栈节点,其中包含一个字符和指向下一个节点的指针。链式栈允许我们在O(1)的时间复杂度插入和删除元素。
以下是一个简单的C++示例,展示了如何实现这个功能:
```cpp
#include <iostream>
#include <stack>
using namespace std;
// 定义链式栈节点
struct Node {
char data;
Node* next;
};
// 创建一个新节点
Node* createNode(char c) {
Node* newNode = new Node();
newNode->data = c;
newNode->next = nullptr;
return newNode;
}
// 检查括号匹配
bool checkBrackets(string str) {
stack<Node*> bracketsStack; // 初始化空链式栈
// 使用映射存储每个括号对应的关闭括号
map<char, char> bracketPairs = { {'(', ')'}, { '[', ']' }, { '{', '}' } };
for (char c : str) {
if (c == '(' || c == '[' || c == '{') { // 如果遇到开放括号
bracketsStack.push(createNode(c)); // 入栈
} else if (bracketsStack.empty()) { // 如果栈为空,直接返回false
return false;
} else {
Node* top = bracketsStack.top(); // 获取栈顶元素
if (bracketPairs[top->data] != c) { // 如果当前字符不是对应闭合括号
return false;
}
bracketsStack.pop(); // 出栈
}
}
// 如果所有括号都有对应的闭合括号,且栈为空,则括号匹配
return bracketsStack.empty();
}
int main() {
string testCases[] = {"()", "({})", "[{()}]", "([)]"};
for (const auto& testCase : testCases) {
cout << "Test case: " << testCase << ", result: ";
if (checkBrackets(testCase)) {
cout << "matches\n";
} else {
cout << "does not match\n";
}
}
return 0;
}
```
在这个程序中,我们遍历输入字符串,如果遇到开放括号就入栈,遇到闭合括号则检查栈顶元素与其是否匹配。如果在整个过程中栈始终为空或者最后一个元素没有找到匹配,那么括号就不匹配。测试部分给出了几个例子来验证这个函数的效果。
阅读全文