数据结构与算法-栈和队列(1)栈的顺序存储结构

(本文是根据b站小甲鱼的数据结构与算法视频所写的笔记,供复习和加强记忆使用)

栈是一种重要的线性结构,可以说,栈是线性表的一种具体表现形式,这是一种后进先出的数据结构,其应用也很广泛,例如我们的浏览器每一次后退都是回到最近的一次浏览网页。

官方定义
栈是一个后进先出的线性表,它要求只在表尾进行删除和插入操作。
在这里插入图片描述
(感觉小甲鱼定义差不多捏。)

注释:表尾称为栈的栈顶,相应的表头称为栈底。

栈的插入操作(Push),叫做进栈,也成为压栈,入栈。
栈的删除操作(Pop),叫做出栈,也称弹栈。

栈的顺序存储结构:

因为栈的本质是一个线性表,线性表有两种存储形式,所以栈也有分为栈的顺序存储结构和栈的链式存储结构。
最开始栈中不含有任何数据,叫做空栈,此时栈顶就是栈底,然后数据从栈顶进入,栈顶栈底分离,整个栈的当前容量变大。数据出栈时从栈顶弹出,栈顶下移,整个栈的当前容量变小。
在这里插入图片描述

typedef struct
{
	ElemType *base;
	ElemType *top;
	int stackSize;
}sqStack;

base是指向栈底的指针,top是指向栈顶的指针变量,stackSize指示栈的当前可使用的最大容量。

栈的初始化
在这里插入图片描述
入栈操作:

在栈顶进行,每次压入一个数据,top指针就要+1,直到栈满为止。

代码
#define SATCKINCREMENT 10
Push(sqStack *s, ElemType e)
{
if(s->top - s->base >= s->stackSize)
{
s->base = (ElemType *)realloc(s->base, (s->stackSize + STACKINCREMENT) * sizeof(ElemType));
if(!s->base)
{
exit(0);
}
s->top = s->base + s->stackSize;
s->stackSize = s->stackSize + STACKINCREMENT;
}
*(s->top) = e;
s->top++;
}

出栈操作:

在栈顶取出数据,栈顶指针随之下移,每弹出一个数据,栈的当前容量就-1.

代码:
Pop(sqStack *s, ElemType *e)
{
if( s->top == s->base)
{
return;
}
*e = * --(s->top);
}

栈的清空操作:

将栈中元素全部作废但本身物理空间不发生改变
因此只要将s->top的内容赋值给s->base即可,这样s->base等于s->top,也就表明是空的了。
在这里插入图片描述

栈的销毁:

销毁一个栈是将该栈的物理内存空间销毁。

代码:
DestroyStack(sqStack *s)
{
int i, len;
len = s->stackSize;
for(i = 0;i<len;i++)
{
free(s->base);
s->base++;
}
s->base = s->top = NULL;
s->stackSize = 0;
}

计算栈的当前容量:
计算栈的当前容量也就是计算栈中元素的个数,因此只要返回s.top-s.base即可。
栈的最大容量是指该栈占据内存空间的大小,值为s.stackSize,与栈的当前容量不是一个概念。
代码清单:
int StackLen(sqStack s)
{
return(s.top - s.base);
}
(指针的相减得到的是他们之间差了多少个元素,具体为两者的地址差除以元素的size)

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值