【数据结构(郝斌)】03线性结构-栈


内存分为静态内存(在栈里分配)和动态内存(在堆里分配)。
栈和堆表示分配数据的方式。
栈:静态内存,以压栈和出栈的方式分配内存。
堆:堆排序的方式分配内存。

https://blog.csdn.net/zichen_ziqi/article/details/80807989

什么是栈

一种可以实现“先进后出”的存储结构。

静态栈 动态栈

区别:

1.静态栈必须提前确定栈的大小(有限的),并且都是连续的.;动态栈可以无限大小(内存够的情况下),并且是不连续的.

2**.静态栈可以复用顺序表的代码;动态栈可以复用单链表**的代码。

静态栈

选择线性表的尾部(头部)作为栈顶,也就是说只能允许在这一端进行操作;相应的在进行出栈操作时也是从线性表的尾部(头部)开始。

动态栈

元素之间不连续

操作

出栈:栈的删除操作

压栈:进栈,栈的插入操作

栈的标准库操作

头文件: #include< stack > 。定义:stack< int > s;

s.empty();         //如果栈为空则返回true, 否则返回false;
s.size();          //返回栈中元素的个数
s.top();           //返回栈顶元素, 但不删除该元素
s.pop();           //弹出栈顶元素, 但不返回其值
s.push();          //将元素压入栈顶

动态栈的操作实现

先定义一个节点数据类型结构体,里面有节点值和下一个节点地址两个成员。
再定义的结构体,里面有一个栈顶节点(指向栈顶元素),一个栈尾节点(指向栈尾元素的下一个没有实际含义的)。

操作

初始化 initStack(PSTACK)
栈的插入
栈的遍历输出
栈的删除
栈的清空

void initStack(PSTACK s)

定义栈结构体变量,并不意味着栈已经创建好了。此时该对象指向的是垃圾值,
需要对其初始化(栈尾和栈头指向同一个没有实际含义的节点(栈尾的下一个))。
造出一个空栈。

参数:栈指针对象(普通栈对象取地址)
步骤
通过malloc函数动态创建这个空间;
栈首等于栈尾;
栈首的下个节点的地址为空。

在这里插入图片描述

void pushStack(PSTACK s,int val)

参数:栈指针对象(普通栈对象取地址)、新节点的数据值
步骤
动态创建一个节点,数据域是数据值,指针域指向原来的栈首。栈首指针域指向新节点。
在这里插入图片描述

void traverse(PSTACK s)

参数:栈指针对象(普通栈对象取地址)
步骤:
定义一个指针节点为栈首
当该节点不为栈尾节点时,输出当前节点数据值。循环输出。
在这里插入图片描述

bool popStack(PSTACK s,int *pVal)

作用:出栈一次,把要出栈的元素存入 pVal形参指向的变量。成功,返回该变量值。失败 false.
步骤:
判断是否为空栈
定义一个节点指向ptop,
ptop指向该栈顶节点的下一位
释放 该节点
赋空该节点
在这里插入图片描述

在这里插入图片描述
测试:
在这里插入图片描述

void clearStack(PSTACK s)

功能:清空栈
步骤:判断是否为空栈
定义两个节点p、q,初始一个p指向栈顶,一个q初始为空,即将指向栈顶的下一个节点。
当p!=栈尾,q指向p的下一个节点。释放p。p等于q。
在这里插入图片描述

栈的应用(无拓展补充)

函数调用

中断

表达式求值

内存分配

缓冲处理

迷宫

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值