参照教材中括号匹配算法,编写一个括号匹配检查的程序:用户从键盘输入一个算术表达式字符串,假设算术表达式中可以包含三种括号:圆括号"(" 和")",方括号"[“和”]“和花括号”{“和”}",且这三种括号可按任意的次序嵌套使用(如:…[…{…}…[…]…]…[…]…(…)…),判断该表达式中出现的括号是否匹配。
COMMON.C
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
SEQSTACK.H
#include"common.h"
#define StackElementType char //栈中元素数据类型为字符
#define Stack_Size 100 //设顺序栈中最大元素个数100
//顺序栈结构定义
typedef struct
{
StackElementType elem[Stack_Size]; //栈中存放数据元素的一维数组
int top; // 栈顶指示器,-1表示空栈
} SeqStack;
//栈的初始化
void InitStack(SeqStack * S);
//判断栈是否为空
int IsEmpty(SeqStack * S);
//进栈
int Push(SeqStack *S,StackElementType x);
//出栈
int Pop(SeqStack *S,StackElementType *x);
//读取栈顶元素
int GetTop(SeqStack *S,StackElementType *x);
//括号匹配-新增
int Match(char ch,char str);
SEQSTACK.C
#include"seqstack.h"
//栈的初始化
void InitStack(SeqStack * S)
{
S->top=-1; //栈顶指针指向-1,表示空栈
}
//判断栈是否为空
int IsEmpty(SeqStack * S)
{
if(S->top==-1)
return TRUE;
else
return FALSE;
}
//进栈
int Push(SeqStack *S,StackElementType x)
{
//如果栈满,返回FALSE
if(S->top==Stack_Size-1)
return FALSE;
S->top++; //栈顶指针上移
S->elem[S->top]=x;
return TRUE ;
}
//出栈
int Pop(SeqStack *S,StackElementType *x)
{
//如果栈空,返回FALSE
if(S->top==-1)
return FALSE;
*x=S->elem[S->top]; //栈顶元素赋值给x
S->top–; //栈顶指针下移
return TRUE;
}
//读取栈顶元素
int GetTop(SeqStack *S,StackElementType *x)
{
//如果栈空,返回FALSE
if(S->top==-1)
return FALSE;
*x=S->elem[S->top]; //栈顶元素赋值给x
return TRUE;
}
//括号匹配算法==========================
int Match(char ch,char str)
{
if(ch==’(’ && str==’)’)
{
return TRUE;
}
else if(ch==’[’ && str==’]’)
{
return TRUE;
}
else if(ch==’{’ && str==’}’)
{
return TRUE;
}
else
return FALSE;
}
MAIN.C
#include “common.h”
#include “seqstack.h”
/* 括号匹配算法及其应用,使用顺序栈方法
{a+[(e+f)*(b-c)]+g}
括号匹配算法, str[]中为输入的字符串,
利用栈技术来检查该字符串中的括号是否匹配
*/
void BracketMatch(char *str) //*str可以理解为字符数组,传递数组地址
{
SeqStack S;
int i;
char ch;
InitStack(&S); //栈初始化
for(i=0;str[i]!=’\0’;i++) //遍历整个字符数组,’\0’表示字符串结束符号
{
switch(str[i])
{
case ‘(’:
case ‘[’:
case ‘{’:
Push(&S,str[i]); //遇到字符串中的左括号一律进栈
break;
case ‘)’:
case ‘]’:
case ‘}’:
if(IsEmpty(&S)) //如果栈为空,则说明右括号有多余。注意:S不是指针类型,不能用->
{
printf("\n右括号多余!");
return;
}
else //读取栈顶元素进行比较
{
GetTop(&S,&ch);
if(Match(ch,str[i])) //比较栈顶元素和对应的数组元素,Match()方法在头文件中
Pop(&S,&ch); //遇到匹配的右括号,则栈顶元素对应的左括号出栈
else
{
printf("\n左右括号不匹配。") ;
return;
}
}
}
}
//循环结束后,检查栈中是否还有元素
if(IsEmpty(&S)) //判断栈是否为空
printf("\n括号匹配!");
else
printf("\n左括号多余!");
}
int main()
{
char str[100];
printf(“请输入字符串:”);
gets(str); //gets() 函数的功能是从输入缓冲区中读取一个字符串存入字符数组str
BracketMatch(str);
return 0;
}