赞
踩
栈在计算机中扮演着重要的角色,它是计算机实现函数调用的基本数据结构。
栈是一种较为特殊的数据结构,它的特点是先进后出。什么意思呢?想象你有一个跟书本一样长宽的盒子,当你依次往里面放进书本1,书本2,书本3之后,如果想要把书本1拿出来,你会发现现在你能拿出来的只有书本3。因为其他两本都被压在下面了。只有当书本3,书本2被依次取出之后,才能取出书本1。数据结构中的栈模拟的就是这样一种结构,盒子就是我们的栈,书本就是我们的数据,放书的过程叫做入栈,而取出最上面的书的过程叫做出栈。
当一个栈被创建之后,它提供给外部的操作只有:入栈,出栈,访问栈顶这几个操作。来看看入栈的例子:
每次入栈操作,除了将数据压入到栈顶之外,还会更新top指针的记录。这个top指针会一直指向栈顶。由于栈维护了一个top指针,使得我们可以在O(1)时间内完成数据入栈的操作。
出栈操作,每次只能弹出栈顶的元素。
如果我们想要弹出元素90,只能先依次把70,80弹出,才可以把90弹出。因为这样才符合先进后出的特性。
在实现上,栈的实现可以用数组来替代。因为数组是编程语言直接支持的最简单的数据结构,可以用它作为基础,来实现其他的数据结构。
从上图中可以发现,把栈横过来就变成了数组,只要按照栈的先进后出特性来访问数组,就可以根据数组来实现栈。入栈(push)和出栈(pop)的代码如下:
//入栈 void push(int a[],int value){ if(top == MAX_SIZE-1){//MAX_SIZE为栈空间大小,此时栈满 return ; }else{ top++;//栈顶指针+1 a[top]=value; } } //出栈 int pop(int a[]){ if(top ==-1){//top指向-1,表示此时栈空 return ; }else{ delete_elem = a[top]; top--;//栈顶指针-1 return delete_elem;//返回删除的栈顶元素 } }
**时间复杂度:**入栈O(1),出栈O(1),访问栈顶O(1)。
适用情况:元素需要“先进后出”。
在我们调用函数的时候,函数调用的顺序,以及函数内部一些变量,都是以栈的形式存储。递归也是依赖着系统内部的栈来实现的,当递归过深或者没有退出时,就会出现“栈溢出”的现象,意思就是函数调用的次数超过了栈能够存储的容量。
公众号:萌凯的程序人生
一枚IT研究生,致力于分享自己的学习经历和总结!
喜欢的话请点赞关注,谢谢您!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。