括号匹配

参照教材中括号匹配算法,编写一个括号匹配检查的程序:用户从键盘输入一个算术表达式字符串,假设算术表达式中可以包含三种括号:圆括号"(" 和")",方括号"[“和”]“和花括号”{“和”}",且这三种括号可按任意的次序嵌套使用(如:…[…{…}…[…]…]…[…]…(…)…),判断该表达式中出现的括号是否匹配。

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;
}

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值