括号匹配的检验

       使用栈的结构检验一串输入的括号和中括号是否匹配,只有()和[]一一对应的时候,该串才算正确的串,如:([]())和[([][])]是正确的串,[(])和([())是不正确的。

       首先读取输入的串,检查每个当前元素,如果是(或者[则压入栈中,是)或]则检查栈顶元素,如果栈顶元素与当前元素刚好闭合,则将栈顶元素弹出。换而言之,栈中存储的内容只有(和[,当栈为空,当前元素为)或]即可判断出当前串不正确。栈为空时串即为正确的串。

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

#define Stack_Init_Size 100
#define Stack_Increment 10
//栈的定义 
typedef struct {
	char* base=NULL;
	char* top;
	int stacksize;
}SqStack;

//初始化栈 
int Init(SqStack &stack){
	if(!stack.base){ 
		stack.base=(char*)malloc(Stack_Init_Size*sizeof(char));
		stack.top=stack.base;
		stack.stacksize = Stack_Init_Size;
		printf("初始化成功\n");
		return 0; //初始化成功 
	}
	else return -1;//表示无法初始化已出始化栈
}

//获取栈顶数据
char GetTop(SqStack stack){
	if(stack.base==stack.top){
		printf("栈中没有数据\n");
		return '#';
	}
	printf("获取栈顶数据成功\n");
	return *(stack.top-1);
} 

//往栈中插入元素
int Push(SqStack &stack,char element){
	if(stack.top-stack.base==stack.stacksize){
		stack.base=(char*)realloc(stack.base,Stack_Increment*sizeof(char));
		stack.top=stack.base+stack.stacksize;
		stack.stacksize+=Stack_Increment;
	}
	*stack.top=element;
	stack.top+=1;
	printf("插入数据成功\n");
	return 0;//表示成功 
} 

//删除栈顶元素
char Pop(SqStack &stack){
	if(stack.top==stack.base){
		printf("栈为空\n");
		return '#';
	}
	printf("删除数据成功");
	return *--stack.top;
} 

//释放栈空间 
int Destroy(SqStack &stack){
	free(stack.base);
	stack.stacksize=0;
	printf("销毁栈成功\n");
	return 0;
}

//处理数据,借助栈判断 
int ExecuteData(SqStack &stack,char* data){
	Push(stack,data[0]);
	for(int i=1;i<strlen(data);i++){
		char top = GetTop(stack);
		switch(top){
			case '(':
				if(data[i]==')')Pop(stack);
				else Push(stack,data[i]);
				break;
			case '[':
				if(data[i]==']')Pop(stack);
				else Push(stack,data[i]);
				break;
			case '#':
				if(data[i]=='('||data[i]=='['){
					Push(stack,data[i]);
					break;
				}
				else  
			default:return -1;break;
		}
	}
	if(stack.top==stack.base){
		Destroy(stack);
		return 0;
	}
	else{
		Destroy(stack);
		return -1;
	}
} 


int main(){
	SqStack stack;
	Init(stack);
	char data[180];
	scanf("%s",data);
	int result = ExecuteData(stack,data);
	if(result==0)printf("括号是正确匹配的\n");
	else printf("括号匹配不正确\n");
	return 0;
} 

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值