前言
日做日新。
题干
问题描述
表达式中的合法括号为“(”、“)”、“[”、“]”、“{”、“}”,这三种括号可以按照任意的次序嵌套使用。
请写一个程序,判断给定表达式中的括号是否匹配,既左右括号顺序和数量都匹配。
输入说明
输入为一个表达式字符串,长度不超过50。
输出说明
对输入的表达式,若其中的括号是匹配的,则输出“yes”,否则输出“no”。
输入样例
样例1输入
[(d+f)*{}2]
样例2输入
[(2+3))
输出样例
样例1输出
yes
样例2输出
no
解析
难点
- 判断括号匹配的方式?——> 函数,使程序模块化
- 判断括号匹配的思想?——> 栈(只有左括号入栈)
- 起始位置的选取?——> 第一个右括号出现,开始与栈顶的左括号匹配
解答
1.0(虽然AC,但我发现OJ的数据 漏情况)比如:输入[[2+3]*3],输出结果错误
#include<stdio.h>
#include<string.h>
int dy(char x,char y);
int main(){
int i,j=0,len;
char a[55],b[55];
gets(a);
len=strlen(a);
for(i=0;i<len;i++){
if(a[i]=='('||a[i]=='['||a[i]=='{'||a[i]==')'||a[i]==']'||a[i]=='}'){
b[j]=a[i];
j++;
}
}
if(j%2!=0){
printf("no");
return 0;
}
else{
len=j;
for(i=0;i<len;i++){
for(j=i+1;j<len;j++){
if(dy(b[i],b[j])==1){
if((i+j)%2==0){
printf("no");
return 0;
}
}
}
}
if(i==len){
printf("yes");
}
}
return 0;
}
int dy(char x,char y){
if(x=='{'&&y!='}') return 0;
if(x=='['&&y!=']') return 0;
if(x=='('&&y!=')') return 0;
if(x=='}'&&y!='{') return 0;
if(x==']'&&y!='[') return 0;
if(x==')'&&y!='(') return 0;
return 1;
}
2.0 利用栈
#include<stdio.h>
#include<string.h>
int left(char c){
if(c=='('||c=='{'||c=='[') return 1;
return 0;
}
int right(char c){
if(c==')'||c=='}'||c==']') return 1;
return 0;
}
int check(char left,char right){
if(left=='('&&right==')') return 1;
if(left=='{'&&right=='}') return 1;
if(left=='['&&right==']') return 1;
return 0;
}
int main(){
int i=0,l;
char stack[30];
int top=0; // initial stack top=0
char s[60];
gets(s);
l=strlen(s);
for(i=0;i<l;i++){
if(left(s[i])==1){
stack[top]=s[i];
top++;
}
else if(right(s[i])==1){
if(check(stack[top-1],s[i])){
top--;
continue;
}
else{
printf("no");
return 0;
}
}
}
if(top==0) printf("yes"); // is stack empty?
else printf("no");
return 0;
}
拓展
栈
数据结构-栈(Stack) - 知乎 (zhihu.com)