数据结构之栈_括号匹配

以下代码基于栈结构,判断一串表达式中括号匹配是否正确。
例如:((x+y)[x+(y+z)(y-z)](10-(z-xy)])
上述表达式括号匹配错误。

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

typedef int T;

typedef struct
{
	T *data;
	int size, top;
} CStack;

CStack CreateStack(int size);
void FreeStack(CStack *S);

void Push(CStack *S, T x);
T Peek(CStack S);
T Pop(CStack *S);
T GetPrior(char a);

int main(){
	
	char str[100];//=(char*)malloc(100*sizeof(char));
	T i=0,len,flag=1;

	
	printf("请输入表达式(以#结尾):\n");
	scanf("%s",str);
	len=strlen(str);
	CStack Soperator=CreateStack(len);		//创建运算符栈 
	Push(&Soperator,'#');					//#入栈 
	
	while(str[i]!='#'||Peek(Soperator)!='#'){
		
		if(str[i]=='('||str[i]==')'||str[i]=='['||str[i]==']'){			//非数字 
				
			if(GetPrior(str[i])-GetPrior(Peek(Soperator))>=0){	//比较运算符优先级 
				
				Push(&Soperator,str[i++]);	//优先级高或相等的入栈 
				
			}else{							//优先级低
			
				if(str[i]==']'&&Peek(Soperator)=='['||str[i]==')'&&Peek(Soperator)=='(') {//匹配,出栈,i++ 
					Pop(&Soperator);
					i++;
				}else{		//不匹配,报错,终止循环 
					flag=0;
					break;
				}						
				 
			}
		}else{
			i++;
		}	
	}
	if(flag==1) printf("\n括号匹配\n");
	else  printf("\n括号不匹配\n");
		
	return 0;
}

T GetPrior(char a){			//优先级函数
	
	T k;
	switch(a){
		case ')':
			k=1;
			break;
		case '(':
			k=2;
			break;
		case ']':
			k=1;
			break;
		case '[':
			k=2;
			break;	
		case '#':
			k=0;
			break;
		default:k=0;
	}
	return k;
} 

CStack CreateStack(int size){		//创建栈
	CStack S;
	S.data = (T*)malloc(size * sizeof(T));
	S.size = size;
	S.top =0;
	return S;
}

void FreeStack(CStack *S){		//释放栈
	free(S->data);
}

void Push(CStack *S, T x){		//入栈
	S->data[++S->top] = x;
}

T Peek(CStack S){				//得到栈顶元素
	return S.data[S.top];
}

T Pop(CStack *S){				//出栈
	return S->data[S->top--];
}

该程序为栈的应用之一,为新手熟悉栈的创建和使用,巩固栈“先入后出”的思想提供了很好的帮助。
小白入门。若有错误,请指正!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值