栈应用之括号匹配(C语言)

{ ( hey! )[不管是电子表还是劳力士,他们的指针都是一样转动的。] } )

宁是否发现了不舒服的地方,oh这种事是无法让强迫症忍受的,没错,这里的括号是不匹配的,就像C语言中,如果你输入的括号不能匹配,那么编译就会出错,如何检测括号是否匹配就是我们今天的任务。

谈谈思路吧,首先是将数据输入,我打算将括号作为字符一个个的存入栈中,那怎样检测括号是否匹配呢?我想这不简单嘛,既然字符都在栈中,那我就先从第一个字符开始,遍历整个栈寻找与其匹配的字符,若没有那就看下一个栈,再遍历,再看下一个再遍历,直到最后的栈。好嘛,这一趟下来算法复杂度为O(N2),不可不可,严格(fang)要求(zong)自己的小橘子决定优化算法。
在这里插入图片描述
算法如下:粗略的说,一个一个将括号入栈,左括号直接入栈,右括号就判段栈顶的左括号是否和它匹配,不配,就把右括号入栈,配,就把栈顶元素出栈。
详细的解析如下:

Created with Raphaël 2.2.0 输入 判断括号是否为左括号 进栈 首先检查栈是否空 进栈 和栈顶元素比较是否匹配 左括号出栈 进栈 yes no yes no yes no

结束循环后,判断栈是否为空,栈空则表示括号匹配。

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

typedef struct
{
	char * base;
	char * top;
	int stacksize;
}stack;

void initstack(stack*s)//栈的初始化函数
{
	s->base = (char*)malloc(sizeof(char));
	if (!s->base)//检测内存是否分配成功
	{
		exit(0);
	}
	s->base = s->top;
	s->stacksize = 10;
}

void push(stack*s, char x)//入栈函数
{
	if (s->top - s->base >= s->stacksize)//先检测是否发生上溢
	{
		s->base = (char*)realloc(s->base, (s->stacksize + 10) * sizeof(char));//若发生,则增加10个内存空间(动态扩容)
		if (!s->base)//检测内存是否分配成功
		{
			exit(0);
		}
		s->stacksize = s->stacksize + 10;
		s->top = s->base + 10;
	}
	*s->top = x;
	s->top++;
}

int main()
{
	stack * s = (stack*)malloc(sizeof(stack));
	initstack(s);
	char c;
	printf("请输入测试用例(如{[]()}#,#标志输入结束):");
	c=getchar();
    push(s,c);
	while (c != '#')
	{
		c=getchar();
		if (c == '{'||c == '('||c == '[')
		{
			push(s, c);
		}
		if (c == '}'||c == ')'||c == ']')
		{
			if (s->base == s->top)
			{
				push(s, c);
			}
            if (c == '}')
            {
                if (*--(s->top) == '{')//这里解释下,*--(s->top)很明显是栈顶元素,但是这个操作已经实现了top--。变相的实现了pop功能。所以实际上是没有删除栈中的元素,只是移动top指针,不断的覆盖元素。
                {
						//top--已经实现,这里不需要任何操作
                }
                else
                {
                    push(s, c);
                }
            }
            if (c == ')')
				{

					if (*--(s->top) == '(')
					{

					}
					else
					{
						push(s, c);
					}
				}
            if (c == ']')
            {
                if (*--(s->top) == '[')
                {

                }
                else
                {
                push(s, c);
                }
            }
		}
	}
	if (s->base == s->top)
	{
		printf("你是个正常人");
	}
	else
	{
		printf("你可能眼睛不太好");
	}
	return 0;
}

have a look please
在这里插入图片描述
在这里插入图片描述

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值