为什么要使用栈这种数据结构
2012-08-04 00:00
1871 查看
顺序栈和链栈
链栈的进栈push和出栈pop操作都很简单,没有任何循环操作,时间复杂度均为O(1)。对比一下顺序栈与链栈,它们在时间复杂度上是一样的,均为O(1)。它们时间复杂度都是一样,那么空间复杂度呢?对于空间性能,顺序栈需要事先确定一个固定的长度,可能会存在内存空间浪费的问题吧?
对,但是顺序栈的优势是存取时定位很方便。而链栈则要求每个元素都有指针域,这也会增加了一些内存开销,但栈的长度就可以无限制了。
明白了。如果栈的使用过程中元素变化不可预料,有时很小,有时非常大,那么最好是用链栈,反之,如果它的变化在可控范围内,建议使用顺序栈会更好一些。
为什么要用栈
有人可能会觉得,用数组或链表直接实现功能不就行了吗?干吗要引入栈这样的数据结构呢?其实这和我们明明有两只脚可以走路,干吗还要乘汽车、火车、飞机一样。理论上,陆地上的任何地方,你都是可以靠双脚走到的,可那需要多少时间和精力呢?我们更关注的是到达而不是如何去的过程。
栈的引入简化了程序设计的问题,划分了不同关注层次,使得思考范围缩小,更加聚焦于我们要解决的问题核心。反之,像数组等,因为要分散精力去考虑数组的下标增减等细节问题,反而掩盖了问题的本质。
所以现在的许多高级语言,比如Java、C#等都有对栈结构的封装,你可以不用关注它的实现细节,就可以直接使用Stack的push和pop方法,非常方便。
延伸阅读
此文章所在专题列表如下:栈的定义与大概理解
栈的抽象数据类型ADT
顺序栈:栈的顺序存储结构
顺序栈的进栈操作
顺序栈的出栈操作
获取顺序栈的栈顶元素
链栈:栈的链式存储结构
链栈的进栈操作
链栈的初始化与遍历
链栈的出栈操作
链栈的置空操作与判断链栈是否为空
为什么要使用栈这种数据结构
递归,栈的重要应用之一
栈是如何实现递归的
接触后缀表达式(逆波兰表示法)
图解后缀表达式的计算过程
将中缀表达式转化为后缀表达式
开始学习队列这个数据结构
队列的抽象数据类型ADT
顺序队列:队列的顺序存储结构
顺序队列的入队操作
顺序队列的出队操作
顺序队列置空与判断操作
队列顺序存储结构的不足
关于循环队列的一些讲解
链队列:队列的链式存储结构
链队列的初始化操作
链队列的入队操作
链队列的出队操作
补完链队列的其它常见操作
循环队列与链队列的优劣势
相关文章推荐
- 为什么支付宝使用用户体验欠佳的安全控件,而国外 Paypal、Google Checkout 都没有这种的设计?
- 如果系统要使用超大整数(超过long长度范围),请你设计一个数据结构来存储这种超大型数字以及设计一种算法来实现超大整数加法运算
- 在什么需求下使用map这种数据结构
- C++ 为什么要同时使用*和&符号?以及什么场合使用这种声明方式?
- 如果系统要使用超大整数(超过long长度范围),请你设计一个数据结构来存储这种超大型数字以及设计一种算法来实现超大整数加法运算)
- 观后感-数据库为什么要使用索引这种结构
- 为什么支付宝使用用户体验欠佳的安全控件,而国外 Paypal、Google Checkout 都没有这种的设计?
- 为什么越来越多的开发者选择使用Spring Boot?
- 为什么我们要使用Go语言以及如何使用它的
- C++结构体前面为什么会经常使用typedef
- 为什么要使用 Go 语言,Go 语言的优势在哪里?
- 数据结构中关于二叉树的使用
- 【SSH进阶之路】Spring的IOC逐层深入——为什么要使用IOC[实例讲解](二)
- 为什么要使用Get和Set访问器
- 个人管理:使用“为什么”来改变我们的结果
- MQ消息队列系列(1)为什么使用MQ
- Android JNI 使用的数据结构JNINativeMethod详解
- 超时时间已到,但是尚未从池中获取连接。出现这种情况可能是因为所有池连接均在使用,并且达到了最大池大小
- 为什么 Windows API 使用 stdcall 调用约定?
- 为什么使用 !!(双重否等?)