栈的相关总结

最近系统的复习数据结构,并练习力扣上的题目,为了让自己记忆理解的更深刻一点,想在这里整理一下各部分的知识总结。当然如果能帮助到大家就更好了。今天整理的部分是栈,同时还有一些自己的思考。

一.定义与特点:

从数据结构的角度讲:

栈是一种具有一定约束的线性表,它只能在一端进行插入和删除操作,即栈顶。
最大的特点就是先入后出(LIFO:Last in First out)
常见的操作就是:建立空栈,入栈,出栈
与之类似可比较的数据结构,有堆和队列
具体比较如下表:

数据结构队列
特点先入后出 LIFO先进先出FIFO优先队列,按优先级求出元素
实现方式数组&链表数组&链表
顺序无需排序,依据输入顺序输出无需排序,依据输入顺序输出需要排序,按照优先级排序
特殊元素栈顶元素top队首&队尾堆顶(大根堆&小根堆,堆顶为最值)

从操作系统的角度讲:

栈(stack)又名堆栈是操作系统在建立某个进程时或者线程,为这个线程建立的存储区域,其空间分配是由操作系统自动分配释放,在缓存时使用一级缓存,调用时放于存储空间中,用完就释放。在编译的时候可以指定需要的栈的大小,常常用于存储局部变量的值,函数的参数值等等。

区别
分配空间系统自动分配并回收程序员动态分配并手动删除
存放元素局部变量值,函数参数手动分配的连续空间
地址顺序由高到低扩展由低到高扩展
内存碎片没有当多次调用malloc和free会产生,降低程序效率
效率高(操作系统提供的数据结构,提供专门寄存器存储,专门的执行指令)低(c++函数库提供的,机制复杂,需要专门算法完成操作

ps:顺便记录一下栈溢出的可能原因

  1. 局部数组过大,当函数中的数组过大会引起堆栈溢出
  2. 递归调用的层次太多,递归函数在运行的过程中会有压栈操作,当压栈元素过多会引起堆栈溢出
  3. 指针和数组越界,例如字符串拷贝没有注意到长度的变化引起堆栈溢出等,此情况最常见

二.与栈密切相关的概念:递归 & 队列 & 堆

常见的模板编程题:

  • 栈和队列的关联性:两个栈实现队列,两个队列实现栈(思想一致,一个用于入栈/队列,一个用于出栈/队列,注意两个之间的更新);
  • 后缀表达式(逆波兰式):只需要存储操作数即可,对于操作符号进行判断,做相应的操作;
  • 的深度优先遍历DFS(先中后)的非递归实现;
  • 单调栈的方式解决问题:一般情况栈是不需要排序的,但是如果题目给出需要排序的情况,可以利用单调栈来实现。利用单调栈实现算法,我们需要考虑单调栈是按照递增方式还是递减方式排序,这个通常依照题目而定。常规的思路是:满足某一条件时始终入栈,直到不满足该条件,需要判断栈顶元素和当前元素的某种特征,再判断是入栈还是其他操作。

编程中的常见问题:

  • 栈空:只要每次入栈,都需要判断栈是否为空
  • 溢出问题

三.c++中标准模板库STL

对于栈的实现,STL中给出了相应的容器适配器stack,在使用过程中:

  • 需要添加头文件#include <stack>
  • 初始化以及相关函数操作:
stack<int> ss;
stack< int, vector<int> > stk;  //覆盖基础容器类型,使用vector实现stk
ss.empty();  //判断stack是否为空,为空返回true,否则返回false
ss.size();   //返回stack中元素的个数
ss.pop();    //删除栈顶元素,但不返回其值
ss.top();    //返回栈顶元素的值,但不删除此元素
ss.push(item);   //在栈顶压入新元素item

如果再有新的总结,还会补充哒!!欢迎大家在留言区评论,如有错误,也请指正,感谢感谢 ~

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值