数据结构----括号匹配问题(顺序栈解决)

用顺序栈解决括号匹配问题

测试代码

#include <stdio.h>
#include <string.h>
#define MaxStackSize 100
typedef char DataType;
#include "SeqStack.h"

void ExpIsCorrect(char exp[], int n){	//判断有n个字符的字符串exp,左右括号是否匹配正确
	SeqStack myStack;
	int i;
	char c;
	
	StackInitiate(&myStack);	//初始化栈
	for(i=0;i<n;i++){
		/*================一下是匹配算法,穷举==============================*/
		if( ( exp[i]=='(' )|| ( exp[i]=='[' )|| ( exp[i]=='{' ) ){
			StackPush(&myStack, exp[i]);	//入栈 
		}else if( exp[i]==')' && StackNotEmpty(myStack) && StackTop(myStack,&c) && c=='(' ){
			StackPop(&myStack,&c);	//()匹配正确,出栈 
		}else if( exp[i]==')' && StackNotEmpty(myStack) && StackTop(myStack,&c) && c!='(' ){
			printf("【()】括号匹配不正确!\n");
			return;
		}else if( exp[i]==']' && StackNotEmpty(myStack) && StackTop(myStack,&c) && c=='[' ){
			StackPop(&myStack,&c);	//()匹配正确,出栈 
		}else if( exp[i]==']' && StackNotEmpty(myStack) && StackTop(myStack,&c) && c!='[' ){
			printf("【[]】括号匹配不正确!\n");
			return;
		}else if( exp[i]=='}' && StackNotEmpty(myStack) && StackTop(myStack,&c) && c=='{' ){
			StackPop(&myStack,&c);	//()匹配正确,出栈 
		}else if( exp[i]=='}' && StackNotEmpty(myStack) && StackTop(myStack,&c) && c!='{' ){
			printf("【{}】括号匹配不正确!\n");
			return;
		}else if( ( exp[i]==')' )|| ( exp[i]==']' )|| ( exp[i]=='}' )&& !StackNotEmpty(myStack) ){
			printf("右括号多余左括号!\n");
			return;
		}
	}
	if(StackNotEmpty(myStack)){
		printf("左括号多余有括号!\n");
	}else{
		printf("括号匹配正确!\n");
	}
}


int main(){
	char num1[] = "(())abc{[]()}";	//测试1,括号配对次序不正确 
	char num2[] = "(()))abc{[]}" ;	//测试2,右括号多余左括号 
	char num3[] = "(()()abc{[]}" ;	//测试3,左括号多余有括号
	char num4[] = "(())abc{[()]}" ;	//测试4,匹配正确
	int n1 = strlen(num1);	//计算出字符串的长度 
	int n2 = strlen(num2);
	int n3 = strlen(num3);
	int n4 = strlen(num4);
	
	ExpIsCorrect(num1,n1);
	ExpIsCorrect(num2,n2);
	ExpIsCorrect(num3,n3);
	ExpIsCorrect(num4,n4);
	printf("\n");
	system("pause");
	return 0;
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值