数据结构与算法——第3章-括号匹配算法(3.5)

一 概述

1
2
3
1.括号匹配算法说明
2.设计思路
3.示例代码

二 括号匹配算法说明

1
2
3
4
5
6
7
在编写代码的时候,经常会用到两种括号:
圆括号 “()” 和大括号 “{}” 。
不管使用哪种括号,程序编译没有问题的其中一个重要因素就是所使用的括号是否能够匹配上.

在编写程序时,括号可以嵌套,即: “({()})” 这种形式,但 “({)” 或者 “({}” 都不符合要求。

括号匹配项目要求:给出任意搭配的括号,判断是否匹配。

三 设计思路

1
2
3
编写程序判断括号匹配问题的时候,使用栈结构会很容易:
1.如果碰到的是左圆括号或者左大括号,直接压栈;
2.如果碰到的是右圆括号或者右大括号,就直接和栈顶元素配对:如果匹配,栈顶元素弹栈;反之,括号不匹配;

四 实现代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
#include <stdio.h>
#include <string.h>
int top=-1;//top变量时刻表示栈顶元素所在位置
void push(char * a,int elem){
a[++top]=elem;
}
void pop(char* a){
if (top==-1) {
return ;
}
top--;
}
char visit(char * a){
//调取栈顶元素,不等于弹栈,如果栈为空,为使程序不发生错误,返回空字符
if (top!=-1) {
return a[top];
}else{
return ' ';
}
}
int main() {
char a[30];
char bracket[100];
printf("请输入括号序列:");
scanf("%s",bracket);
getchar();
int length=(int)strlen(bracket);
for (int i=0; i<length; i++) {
//如果是左括号,直接压栈
if (bracket[i]=='('||bracket[i]=='{') {
push(a, bracket[i]);
}else{
//如果是右边括号,判断与栈顶元素是否匹配,如果匹配,栈顶元素弹栈,程序继续运行;否则,发现括号不匹配,输出结果直接退出
if (bracket[i]==')') {
if (visit(a)=='(') {
pop(a);
}else{
printf("括号不匹配");
return 0;
}
}else{
if (visit(a)=='{') {
pop(a);
}else{
printf("括号不匹配");
return 0;
}
}
}
}
//如果所有括号匹配完成,栈内为空,说明所有括号全部匹配成功
if (top!=-1) {
printf("括号不匹配");
}else{
printf("括号匹配");
}
}

运行结果

1
2
请输入括号序列:{}(){
括号不匹配

五 参考

  • C语言中文网—括号匹配算法