链栈的应用:括号匹配       ——以c语言为例

//链栈的应用:括号匹配 
#include <stdio.h>
#include <stdio.h>
#include <iostream>
using namespace std;
#define sElemType int
typedef struct linkNode{
	sElemType data;//数据域 
	linkNode *next;//指针域 
}*linkStack;
 //判空函数(链栈为空返回1;不为空返回0) 
 int isEmpty(linkStack top){
 	return top==NULL;
 }
 //初始化链栈 
 void initLinkStack(linkStack &top){
 	top=NULL;
 }
 //插入元素到链栈 
 void push(linkStack &top,sElemType val){
 	linkStack newNode=new linkNode[1];
 	newNode->data=val;
	 newNode->next=top; 
	 top=newNode;
 }
 //删除链栈的栈顶元素 
 void pop(linkStack &top,sElemType &val){
 	if(isEmpty(top)){
 		return;
	 }
 	val=top->data;
 	linkStack  tempPtr=top;
 	top=top->next;
 	delete tempPtr;
 } 
 //判断字符是左括号还是右括号,左括号返回1;右括号返回0;其他返回2. 
int leftOrRight(char c){
	switch(c){
		case'(':
		case'[':
		case'{':
			return 1;
		case')':
		case']':
		case'}':
			return 0;
		default: 
			return 2;
	}
} 
//单字符串括号匹配;如果匹配成功返回1;匹配失败返回0. 
int isMatching(char left,char right){
	if('('==left&&')'==right||'['==left&&']'==right||'{'==left&&'}'==right)
		return 1;
	else  
		return 0;
	
} 
//整个字符串数组匹配;如果匹配成功返回1;匹配失败返回0. 
int bracketMatch(char *str){
	linkStack top;
	initLinkStack(top);
	int i=0;
	while('\0'!=str[i]){
		if(leftOrRight(str[i])==1){
			push(top,str[i]);
			//单字符串是左括号,将左括号压入栈中 
		}
		if(leftOrRight(str[i])==0){
			sElemType e;
			if(isEmpty(top)==1){
			//栈顶为空,说明有多余的右括号,即左括号少于右括号,匹配失败 
				return 0;
			}
			pop(top,e);//栈顶不为空且字符串是右括号,从栈顶弹出一个左括号
			if(0==isMatching(e,str[i])) //一次匹配失败,则匹配失败 
				return 0;
			
		}
		i++;
		
	}
	 
	 
	if(isEmpty(top)==1){
	//如果全部匹配完之后,栈顶为空,说明匹配成功; 
		return 1;
	}else 
	//栈顶不为空,说明有多余的左括号,即左括号多于右括号 
		return 0;
} 
int main(){
	char str[100];
	cin>>str;
	if(bracketMatch(str)==1){
		cout<<"括号匹配成功"<<endl;
	}else{
		cout<<"括号匹配失败"<<endl;
	}
} 在这里插入代码片

左括号多于右括号,匹配失败:
在这里插入图片描述
右括号多于左括号,匹配失败:
在这里插入图片描述
括号匹配顺序错误,匹配失败:
在这里插入图片描述
括号匹配成功:
在这里插入图片描述

  • 3
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值