数据结构--括号匹配检验(数据结构习题)

《数据结构》严蔚敏版习题3.2.2,括号匹配问题。是顺序栈的课后习题。原问题:假设表达式中允许包括两种括号:圆括号和方括号,其嵌套方式随意,即(【】())等都是正确的格式,【(】)是不正确的格式。设计一个算法检查输入的字符串中的括号是否是匹配的。
/-------------------------------------------------------------/
思路:使用栈来解决,遇到(、【就入栈,遇到)、】且刚还能和栈顶元素匹配是就出栈,遇到其他元素不做处理。字符转中所有的元素都处理完后,查看栈的长度,若为空栈说明括号匹配,栈非空则说明括号不匹配。
所以需要一个可以存储字符元素的栈,以及匹配的各种方法:

#include<stdio.h>
#include<stdlib.h>
#define INITSIZE 100
#define INCRSIZE 10
#define ERROR 0
#define OK 1

typedef int Status;
typedef struct {
	char *base;
	char *top;
	int size;
}SqStack;

Status InitStack(SqStack *s){
	s->base=(char *)malloc(INITSIZE*sizeof(char));
	if(!s->base){
		return ERROR;
	}
	s->top=s->base;
	s->size=INITSIZE;
	return OK;
}

Status DestroyStack(SqStack *s){
	if(!s->base){
		exit(1);
	}
	free(s->base);
	s->base=NULL;
}

Status ClearStack(SqStack *s){
	s->top=s->base;
}

Status StackEmpty(SqStack *s){
	if(s->top==s->base){
		return 1;
	}else{
		return 0;
	}
}

int StackLength(SqStack *s){
	return (s->top-s->base);
}

Status GetTop(SqStack s,char *e){
	if(s.top==s.base){
		return ERROR;
	}
	*e=*(s.top-1);
	return OK;
}

Status Push(SqStack *s,char e){
	if(s->top-s->base>=s->size){
		s->base=(char *)realloc(s->base,(s->size+INCRSIZE)*sizeof(char));
		if(!s->base){
			exit(1);
		}
		s->top=s->base+s->size;
		s->size+=INCRSIZE;
	}
	*(s->top)=e;
	s->top++;
	return OK;
}

Status Pop(SqStack *s,char *e){
	if(s->top==s->base){
		return ERROR;
	}
	*e=*(--s->top);
	return OK;
}

void StackTraverse(SqStack *s){
	if(!s->base){
		exit(1); 
	}
	char *t=s->top-1;
	while(t>=s->base){
		printf("%c",*t);
		t--;
	}
}

保存为stack.h的头文件:
然后是设计主函数的算法:
先画出算法流程图:
算法流程图
实现代码:

#include<stdio.h>
#include<stdlib.h>
#include"stack.h"

int main(){
	SqStack s,*sp=&s;
	InitStack(sp);
	char str[20];
	scanf("%s",str);
	if(str[0]==']'||str[0]==')'){
		printf("括号不匹配\n");
		exit(1);
	}
	char c,d,*cp=&c,*dp=&d;
	for(int i=0,c=str[0];c!='\0';i++){
		c=str[i];
		if(!StackEmpty(sp)){
			GetTop(s,dp);
		}
		char t,*tp=&t;
		switch(c){
			case '[':Push(sp,c);break;
			case '(':Push(sp,c);break;
			case ']':if(d=='['){
				Pop(sp,tp);
			}else{
				Push(sp,c);
				//printf("括号不匹配\n");
			}
			break;
			case ')':if(d=='('){
				Pop(sp,tp);
			}else{
				Push(sp,c);
				//printf("括号不匹配\n");
			}
			break;
			default:break;
		}
	}
	printf("当前栈长:%d\n",StackLength(sp));
	if(StackEmpty(sp)){
		printf("括号匹配\n");
	}else{
		printf("括号不匹配\n");
	}
	return 0;
}

运行实验:

(x+y)+[z-t*(8*7)]
当前栈长:0
括号匹配

--------------------------------
Process exited after 49.2 seconds with return value 0
请按任意键继续. . .
/-------------------------------/


(])
当前栈长:3
括号不匹配

--------------------------------
Process exited after 10.03 seconds with return value 0
请按任意键继续. . .

代码运行正确。

  • 21
    点赞
  • 108
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

KOKO银角大王

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值