数据结构篇3—《龙门客“栈”》

在这里插入图片描述

🚩前言

前面记录了关于顺序表和链表的数据结构,这一篇文章就来说一下“栈”这一个数据结构。当然不是什么龙门客栈了哈哈。接下来就来实现一下栈这个结构吧,并用实例来展示栈的应用!✌

1、栈的概念

栈 :一种特殊的线性表,在存储数据的时候和顺序表以及单链表有所区别。我们通过图来展示:
在这里插入图片描述

2、栈的实现框架

在这里插入图片描述

3、栈的代码实现

该栈的实现是用顺序表的结构,模拟实现栈。

3.1、栈的初始化和销毁

void STInit(ST* pst)
{
	assert(pst);
	pst->a = NULL;//此处可以给空间,也可以先不给,
	//在插入的时候再给。
	pst->capacity = 0;
	pst->size = 0;
}

void STDestory(ST* pst)
{
	assert(pst);
	free(pst->a);
	pst->a = NULL;
	pst->capacity = 0;
	pst->size = 0;
}

3.2、入栈\出栈\返回栈顶元素\元素个数\判空

void STPush(ST* pst, STDataType data)
{
	assert(pst);
	if (pst->top == pst->capacity)
	{
		int NewCapacity = pst->capacity == 0 ? 4 : pst->capacity * 2;
		
		STDataType* tmp = 
		(STDataType*)realloc(pst->a,NewCapacity*sizeof(STDataType));
		
		if (tmp == NULL)
		{
			perror("STPush::realloc fail!");
			return;
		}
		else
		{
			pst->a = tmp;
			pst->capacity = NewCapacity;
		}
	}
	pst->a[pst->top++]=data;
}

void STPop(ST* pst)
{
	assert(pst && pst->top > 0);
	pst->top--;
}


STDataType STTop(ST* pst)
{
	assert(pst&&pst->top);
	return pst->a[pst->top - 1];
}

int STSize(ST st)
{
	assert(&st);
	return st.top;
}

bool STEmpty(ST st)
{
	assert(&st);
	return st.top == 0;
}

3.3、栈定义注意事项

①对于top初值的大小:
在这里插入图片描述

4、栈的应用实例——《括号匹配问题》

oj括号匹配问题

思路:
①首先括号匹配需要考虑两个点:数量上匹配和方向上匹配(左括号要匹配右括号)。
②利用栈结构实现该题:只要是左括号(全部类型的),就入栈;如果遇到右括号,则出栈顶元素(也就是和栈顶左括号进行匹配)。在这我们直接判断不匹配是情况,就是只判断不匹配情况,匹配的情况不用管。
代码如下:

bool isValid(char* s) {
    ST st;
    STInit(&st);
    while(*s!='\0')
    {
        if((*s=='(') || (*s=='{') || (*s=='['))
        {
            STPush(&st,*s);
        }
        else
        {
            if(STEmpty(&st))
            {
                return false;
                STDestory(&st);
            }
            DataType ret=GetTopElement(&st);
            STPop(&st);

            if((ret == '(' && *s != ')')
            ||(ret == '{' && *s != '}')
            ||(ret == '[' && *s != ']'))
            {
                return false;
            }
        }
        s++;
    }
    return STEmpty(&st);
   STDestory(&st);
}
  • 6
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值