利用顺序栈实现括号匹配

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <string.h>


#define TRUE 1
#define FALSE 0
#define OVERFLOW 0
#define OK 1
#define ERROR 0


#define STACK_INIT_SIZE 300//存储空间初始化分配量
#define STACKINCREMENT 30//存储空间分配增量
#define MAXLEN 10
typedef int Status;
 




typedef char ElemType;


typedef struct{           //构建一个栈
ElemType  *base;    
    ElemType  *top;  
    int  stacksize;    
  } SqStack;




Status InitStack(SqStack &S) //初始化栈
{
S.base=(ElemType*)malloc(STACK_INIT_SIZE*sizeof(ElemType));
if(!S.base) exit(OVERFLOW);
S.top=S.base;
S.stacksize=STACK_INIT_SIZE;
return OK;
};


Status Push(SqStack &S, ElemType e){  //入栈
if (S.top-S.base>=S.stacksize){//栈满,追加存储空间
S.base=(ElemType*)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof (ElemType));
if(!S.base)exit(OVERFLOW); //存储分配失败
       S.top =S.base+S.stacksize;
       S.stacksize+=STACKINCREMENT;
}
   *S.top++ =e;
    return OK;

}




Status Pop(SqStack &S,ElemType &e) {//出栈
    if(S.top==S.base)
return ERROR;
    e=* --S.top;
    return OK;
}




Status StackEmpty(SqStack S) //判断栈是否为空
{
if(S.top==S.base) return TRUE;
else return FALSE;
};




Status DestroyStack(SqStack &S)//摧毁栈
{
free(S.base);
S.base=NULL;
S.top=NULL;
S.stacksize=0;
return OK;
}


int StackLength(SqStack S) //求栈长
{
return S.top-S.base;
}


Status GetTop(SqStack S, ElemType &e)  //取栈顶元素
{
if (S.top==S.base) return ERROR;
else
e=*(S.top-1);
return OK;
}


Status ClearStack(SqStack &S) //清空栈
{
S.top = S.base;
return OK;
}




Status StackTravers(SqStack S, Status (*visit)(ElemType)) //遍历栈
{
ElemType *p=S.base;
if (S.top==S.base) return ERROR;
do
{
if (!visit(*p)) return ERROR;
}while (p++ !=S.top );
return OK;
}
Status matching(SqStack S,char *exp)
{
int i=0;
char e;
while(i<strlen(exp)) {
     switch (exp[i]) {
case '(':
case '[':
case '{':
{Push(S,exp[i]); i++; break;}
    case ')':
    case ']':
        case '}':
if(StackEmpty(S)) 
{
printf("括号匹配失败");
return ERROR;
}
else 
{
GetTop(S,e);
if((exp[i]==')' && e=='(') || (exp[i]=='}' && e=='{') || (exp[i]==']' && e=='[')) 
{
Pop(S,e);
i++;
break;
}
else 
{
printf("括号匹配失败");
return ERROR;
break;
}
}
}
}
  if (StackEmpty(S))
{
printf("括号匹配成功");
return OK;
}
else
printf("括号匹配失败");
return ERROR;

}



void main(){


char str[100];
SqStack S;
InitStack (S);
printf("请输入括号\n");
gets(str);
matching(S,str);
}
  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值