mobile wallpaper 1mobile wallpaper 2mobile wallpaper 3mobile wallpaper 4mobile wallpaper 5mobile wallpaper 6
436 字
1 分钟
利用栈实现括号检查匹配
2026-04-06

利用栈实现括号匹配检查#

本文的目的是实现检查括号的匹配性。包含(),【】,{}。

即括号是否正确闭合。🤔

比如{(A+B)+(C+D)}就是闭合的,而{(x+y)*(z)则缺少一个右括号,是不闭合的!

检查括号通常是编译器的工作,所以我们来帮他实现一下吧。

实现要求?#

  • 首先肯定要满足左边括号的数量等于右括号的数量。但是显然这肯定不够🤔
  • 右括号要有左括号对应 比如)(就是数量满足但是不匹配
  • 可以出现右括号的条件是:与其对应的左括号之后出现的所有括号都已经匹配才行!比如[(])就不行。换句话说就是靠右的左括号要先关闭(即就近关闭,左括号会选择一个最近的右括号来匹配),比如[()()]

解决方案#

我们可以从左到右扫描表达式,如果碰到一个开放的左括号,就把他填入栈中。

如果我们碰到一个关闭的括号,它就是列表中最后一个括号所匹配的括号!。如果不一致,或者由于列表是空的但是却有关闭括号!我们就可以说括号不匹配!

否则我们就将被匹配上的括号从栈中弹出。

我们来模拟一下过程吧,样本采用[()()]

当前list:empty
开始读取括号··········
当前list:[
开始读取括号··········
当前list:[(
开始读取括号··········匹配成功,弹出最近的括号
当前括号:[
接着就是重复工作,扫到最后列表会变成空。(ps:跟消消乐差不多😎)

这里的列表总是满足后进去的先出来,栈正好满足这一特性,所以选他做数据容器相当合适!

完整代码

#include<iostream>
#include<stack>
#include<cstring>
using namespace std;
bool Check(const char* exp){
stack<char> S;
int n=strlen(exp);
for(int i=0;i<n;i++){
char c=exp[i];
if(c=='{'||c=='('||c=='['){
S.push(c);
}
else if(c=='}'||c==']'||c==')'){
if(S.empty()) return false;//先检查一下是否直接就是右括号!
char d=S.top();
if(
(c==')'&&d=='(')||
(c=='}'&&d=='{')||
(c==']'&&d=='[')
){
S.pop();
}
else{
//类型不匹配
return false;
}
}
}
return S.empty();
}
int main(){
char exp[1000];
cout<<"please input text: ";
cin.getline(exp,1000);
if(Check(exp)){
cout<<"success!";
}
else{
cout<<"defeat!";
}
return 0;
}

a

分享

如果这篇文章对你有帮助,欢迎分享给更多人!

利用栈实现括号检查匹配
https://fatdog.20060113.xyz/posts/stack-bracket/
作者
神秘大胖狗
发布于
2026-04-06
许可协议
CC BY-NC-SA 4.0

部分信息可能已经过时

封面
Sample Song
Sample Artist
封面
Sample Song
Sample Artist
0:00 / 0:00