栈在括号匹配中的应用

栈在括号匹配中的应用(C语言)


类型定义

typedef char ElemType;

typedef struct{                 //顺序栈类型定义
    ElemType data[MaxSize];
    int top;
}SqStack;


使用基本操作

接口说明

void InitStack(SqStack *S){		//初始化栈
	S->top==-1;
}

int StackEmpty(SqStack S){		//判断栈是否为空
	if(S.top==-1)
		return 1;
	else
		return 0;
}

int Push(SqStack *S,ElemType x){	 //新元素入栈
	if(S->top==MaxSize-1)
		return 0;
	S->data[++S->top]=x;
	return 1;
}

int Pop(SqStack *S,ElemType *x){	  //栈顶元素出栈,用X返回
	if(S->top==-1)
		return 0;
	*x=S->data[S->top--];
	return 1;
}

括号匹配算法

int BraketCheck(char str[],int lenth){
    SqStack S;      //定义顺序栈S
    InitStack(&S);      //初始顺序栈

    for(int i=0;i<lenth;i++){
        if(str[i]=='{' || str[i]=='(' || str[i]=='['){   //判断是否为左括号
            Push(&S,str[i]);       //将左括号压入栈中
        }      
        else{
            if(StackEmpty(S))      //判断栈是否为空
                return 0;
            
            char x;        //变量x存储栈顶元素
            Pop(&S,&x);
            if(str[i]=='}' && x!='{')    //判断当前的右括号是否与栈顶的左括号匹配
                return 0;
            if(str[i]==')' && x!='(')
                return 0;
            if(str[i]==']' && x!='[')
                return 0;
        }
    }
    return StackEmpty(S);     //检索完所有括号后,栈为空代表匹配成功
}

不使用基本操作

括号匹配算法

int BraketCheck2(char str[],int lenth){
    char S[MaxSize];      
    int top=-1;   //初始顺序栈

    for(int i=0;i<lenth;i++){
        if(str[i]=='{' || str[i]=='(' || str[i]=='['){   //判断是否为左括号
            S[++top]=str[i];    //将左括号压入栈中
        }      
        else{
            if(top==-1)     //判断栈是否为空
                return 0;
            
            char x;    //变量x存储栈顶元素
            x=S[top--];
            if(str[i]=='}' && x!='{')  //判断当前的右括号是否与栈顶的左括号匹配
                return 0;
            if(str[i]==')' && x!='(')
                return 0;
            if(str[i]==']' && x!='[')
                return 0;
        }
    }
    return top==-1 ;    //检索完所有括号后,栈为空代表匹配成功
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值