题目背景
我们都知道,在编程语言中,我们常用多种类型的括号,( )圆括号
、[ ]方括号
、{ }花括号
,当括号不匹配时,编译时会发生错误。那么编译器是如何检验括号匹配性的呢?
题目分析
下面列举了若干实例帮助理解匹配性的判断标准
Expression | Balanced? | Reason |
---|---|---|
{(a+b)+[a-b]} | Yes | |
)( | No | 右括号必须在左括号右边 |
[ ( ] ) | No | 后出现的左括号要先完成匹配(Last Opened First Closed) |
[ ( ) ( ) ] | Yes | 任何右括号要对应它左侧距它最近的左括号 |
代码实现
代码
#include<iostream>
#include<stack>
using namespace std;
stack<char> S;//定义一个用于存放括号的栈
int match(char c){//设计一个match函数,如果右括号和位于栈顶的左括号相匹配返回1,否则返回0
if((S.top()=='('&&c==')')||(S.top()=='['&&c==']')||(S.top()=='{'&&c=='}'))
return 1;
else
return 0;
}
char a[20];
int main(){
gets(a);
char exp;//该变量用于存放当前的左括号
int len = strlen(a);
for(int i=0;i<len;i++){
exp = a[i];
if(exp=='('||exp=='['||exp=='{')//当识别到左括号即进栈
S.push(exp);
else if(exp == ')'||exp == ']'||exp == '}'){//如果识别到右括号
if(S.empty()||match(exp)==0){//如果栈内是空的(说明右括号前没有左括号);或者括号不匹配
printf("No");
return 0;
}
else//如果匹配,则让匹配完成的左括号出栈
S.pop();
}
}
if(S.empty()){//完成遍历后,若栈中剩余括号,证明括号不匹配;若空栈,证明匹配
printf("Yes");
return 0;
}
else{
printf("No");
return 0;
}
}
输入/出结果
example 1:
{(a+b)+[a-b]}
Yes
example 2:
)(
No
example 3:
[ ( ] )
No
example 4:
[ ( ) ( ) ]
Yes