用栈实现:输入一行符号,以#结束,判断其中的括号是否匹配。括号包括: {} [] () <> 示例输入:as(*x<{(({<>}))}>)# 期望输出:right 示例输入:(a.b)># 期望输出:The 6 character '>' is wrong. 示例输入:({()# 期望输出:loss of right character }).
时间: 2024-03-03 15:48:39 浏览: 51
用栈判断括号是否匹配
好的,我可以帮你解决这个问题。以下是用 C++ 实现的代码:
```cpp
#include <iostream>
#include <stack>
#include <cctype>
using namespace std;
bool is_left(char ch) {
return ch == '(' || ch == '[' || ch == '{' || ch == '<';
}
bool is_right(char ch) {
return ch == ')' || ch == ']' || ch == '}' || ch == '>';
}
bool match(char left, char right) {
return (left == '(' && right == ')') ||
(left == '[' && right == ']') ||
(left == '{' && right == '}') ||
(left == '<' && right == '>');
}
int main() {
stack<char> s;
char ch;
bool flag = true;
while (cin >> ch && ch != '#') {
if (is_left(ch)) {
s.push(ch);
} else if (is_right(ch)) {
if (s.empty()) {
cout << "The " << ch << " character is wrong." << endl;
flag = false;
break;
} else if (!match(s.top(), ch)) {
cout << "loss of right character " << s.top() << "." << endl;
flag = false;
break;
} else {
s.pop();
}
}
}
if (flag && s.empty()) {
cout << "right" << endl;
} else if (flag && !s.empty()) {
cout << "loss of left character " << s.top() << "." << endl;
}
return 0;
}
```
这个程序使用一个栈来维护左括号,当读入一个右括号时,从栈顶取出一个左括号进行匹配。如果栈为空,说明缺少左括号;如果栈顶的左括号和当前的右括号不匹配,说明左右括号不配对;否则将栈顶的左括号弹出。
程序还需要处理一些特殊情况,比如输入一个不是括号的字符,或者最后栈中还有剩余的左括号没有匹配。
阅读全文