用栈实现括号匹配的算法

要求:

用栈的基本操作实现括号匹配算法,要求至少包括两种类型的括号。

下面的代码是我的一些思路,并不算最优的,大家学习就好啦

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

#define MAX 5			//初始创建栈的容量
#define ADD 5			//栈满时新增的容量

typedef char ElemType;
typedef struct
{
	ElemType *base;		//栈底
	ElemType *top;		//栈顶
	int max;		//栈的容量
}sqStack;

initStack(sqStack *s)		//创建一个容量为 MAX 的空栈
{
	s->base = (ElemType *)malloc(MAX * sizeof(ElemType));
	if (!s->base)
	{
		exit(0);
	}
	s->top = s->base;
	s->max = MAX;
}

Push(sqStack *s, ElemType e)	//进栈
{
	if (s->top - s->base >= s->max)
	{
		s->base = (ElemType *)realloc(s->base, (s->max = ADD) * sizeof(ElemType)); //当栈满时申请 ADD 个空间
		if (!s->base)
			exit(0);
		s->top = s->base + s->max;
		s->max = s->max = ADD;
	}
	*(s->top) = e;
	s->top++;
}

Pop(sqStack *s, ElemType *e)	//出栈
{
	if (s->top == s->base)
		return 0;
	else
	{
		*e = *--(s->top);
		return 1;
	}
}

int StackLen(sqStack s)	//计算栈的容量	
{
	return (s.top - s.base);
}

int main()
{
	sqStack p;
	ElemType q;
	initStack(&p);
	int count = 1;
	printf("输入括号进行判断,以#结束,支持“()” “<>” “{} ”\n");
	while ((q = getchar())  != '#')
	{
			if ('(' == q)
			{
				Push(&p, q);
				count = StackLen(p);	//进栈一次计数一次
			}
			else if ((q == ')') && (--(p).top == '('))
			{
				if (count)//出栈前判断栈是否为空
				Pop(&p, &q);
			}
			else if ('{' == q)
			{
				Push(&p, q);
				count = StackLen(p);
			}
			else if ((q == '}') && (--(p).top == '{'))
			{
				if (count)
				Pop(&p, &q);
			}
			else if ('[' == q)
			{
				Push(&p, q);
				count = StackLen(p);
			}
			else if ((q == ']') && (--(p).top == '['))
			{
				if (count)
				Pop(&p, &q);
			}
			else if ('<' == q)
			{
				Push(&p, q);
				count = StackLen(p);
			}
			else if ((q == '>') && (--(p).top == '<'))
			{
				if (count)
				Pop(&p, &q);
			}
	}
	count = StackLen(p);	//循环结束后再判断栈是否还有元素
	if (!count)		//flag为0时代表已经全部匹配出栈
		printf("yes\n");
	else
		printf("no\n");
	return 0;
}

注:代码仅供学习使用

    原文作者:括号匹配问题
    原文地址: https://blog.csdn.net/github_35781185/article/details/52967180
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞