题目: 设表达式中包含三种括号:圆括号、方括号和花括号,它们可互相嵌套,如 ([{}]) 或 ({[][()]}) 等均为正确的格式,而 {[]})} 、{[() ]或 ([]} 均为不正确的格式。
利用栈的结构编写程序检验输入的括号表达式是否匹配。
思路: 利用栈“后进先出”的特点,每次读入一个括号:
(1)左括号:直接入栈等待匹配;
(2)右括号:
①栈为空说明没有与该右括号匹配的左括号,则该右括号多余;
②栈不为空则将该右括号与栈顶括号比较,若匹配则将栈顶元素出栈,若不匹配则说明左右括号类型不匹配。
当所有括号全部全部读完时,若栈为空则说明所有括号都匹配,若栈不为空则说明有左括号多余。
注意:只有左括号需要进栈,右括号不需要进栈。
完整代码+注释
# include<stdio.h>
# define Stack_Size 50
# define FALSE 0
# define TRUE 1
/*顺序栈的存储结构*/
typedef struct {
char elem[Stack_Size];
int top;
}SeqStack;
/*初始化顺序栈*/
void InitStack(SeqStack* S) {
S->top = -1;
}
/*顺序栈进栈*/
int Push(SeqStack* S, char x) {
if (S->top == Stack_Size - 1)
return FALSE;
S->top++; //修改栈顶指针
S->elem[S->top] = x; //x进栈
return TRUE;
}
/*顺序栈出栈*/
int Pop(SeqStack* S) {
if (S->top == -1)
return FALSE;
S->top--; //修改栈顶指针
return TRUE;
}
/*返回栈顶元素*/
char GetTop(SeqStack* S) {
if (S->top == -1)
return NULL;
char x;
x = S->elem[S->top]; //栈顶元素赋值给x
return x;
}
/*返回栈内元素个数*/
int GetLen(SeqStack* S) {
return S->top + 1;
}
/*顺序栈判空函数,为空返回TRUE*/
int IsEmpty(SeqStack* S) {
if (S->top == -1)
return TRUE;
else
return FALSE;
}
/*同类型括号判断*/
int Match(char a, char b) {
if (a == '(') {
if (b == ')')
return TRUE;
else
return FALSE;
}
if (a == '[') {
if (b == ']')
return TRUE;
else
return FALSE;
}
if (a == '{') {
if (b == '}')
return TRUE;
else
return FALSE;
}
}
/*基于栈的括号匹配算法*/
void BracketMatch(SeqStack* S, char* str) {
int i, a, flag = 1;
char ch;
InitStack(&S); //初始化为空栈
for (i = 0; str[i] != '\0'; i++) {
switch (str[i]) {
case '(':
case '[':
case '{':
Push(&S, str[i]); //左括号则进栈
break;
case ')':
case ']':
case '}':
if (IsEmpty(&S)) { //栈为空说明当前右括号前无左括号
printf("括号不匹配,右括号 %c 多余!\n", str[i]);
flag = 0;
}
else {
ch = GetTop(&S);
if (Match(ch, str[i]))
Pop(&S); //左右括号匹配则将左括号出栈
else {
printf("括号不匹配,左括号 %c 右括号 %c 类型不匹配!\n", ch, str[i]);
Pop(&S); //将不匹配的左括号出栈
flag = 0;
}
}
}
}
if (IsEmpty(&S) && flag) //括号字符串全部扫描完时栈为空且flag不为0,说明所有括号均匹配
printf("括号匹配!\n");
else { //栈中仍有元素剩余说名左括号有多余
int length = GetLen(&S);
for (i = 0; i < length; i++) { //输出多余的左括号
printf("括号不匹配,左括号 %c 多余!\n", GetTop(&S));
Pop(&S);
}
}
}
int main() {
SeqStack S;
int i, length;
char str[Stack_Size];
printf("请输入括号字符串长度:");
scanf("%d", &length);
printf("请输入括号字符串:");
for (i = 0; i < length; i++)
scanf(" %c", &str[i]);
str[i] = '\0';
BracketMatch(&S, str); //调用括号匹配算法函数
return 0;
}
运行结果