题目描述:
设计一个算法利用顺序栈检查用户输入的表达式里的括号是否配对,假设表达式中可能含有圆括号()、中括号[]和大括号{}
输入:
占一行为含有三种括号的表达式(最长100个符号)
输出:
匹配时输出YES,小括号不匹配输出NO1,中括号不匹配时输出NO2,大括号不匹配时输出NO3
#include <iostream>
#include <stack>
#include <string>
using namespace std;
string checkBrackets(const string& expression) {
stack<char> s;
for (char ch : expression) {
switch (ch) {
case '(':
case '[':
case '{':
s.push(ch);
break;
case ')':
if (!s.empty() && s.top() == '(') {
s.pop();
}
else {
return "NO1";
}
break;
case ']':
if (!s.empty() && s.top() == '[') {
s.pop();
}
else {
return "NO2";
}
break;
case '}':
if (!s.empty() && s.top() == '{') {
s.pop();
}
else {
return "NO3";
}
break;
default:
// 忽略非括号字符
break;
}
}
// 检查栈是否为空
if (!s.empty()) {
char remaining = s.top();
if (remaining == '(') return "NO1";
else if (remaining == '[') return "NO2";
else if (remaining == '{') return "NO3";
}
return "YES";
}
int main() {
string expression;
getline(cin, expression);
cout << checkBrackets(expression) << endl;
return 0;
}
解析:
使用一个栈(stack)来追踪和匹配括号。遍历输入的字符串,每当遇到一个开括号(即'('、'['或'{'),就将其压入栈中;每当遇到一个闭括号(即')'、']'或'}'),就检查栈顶元素。如果栈顶元素与当前闭括号匹配,则从栈中弹出该元素;如果不匹配,则根据不匹配的类型输出相应的信息(NO1, NO2, NO3)。如果整个表达式遍历完成后栈为空,则所有括号都正确匹配,输出"YES";如果栈不为空,则也表示有未匹配的开括号,应根据栈中剩余的括号类型输出相应的信息。