栈(stack)
- 从数据结构的角度理解:是一组数据的存放方式,特点为LIFO,即后进先出(Last in, first out)。在这种数据结构中,数据像积木那样一层层堆起来,后面加入的数据就放在最上层。使用的时候,最上层的数据第一个被用掉,这就叫做”后进先出”。
- 从代码运行方式角度理解:是调用栈,表示函数或子例程像堆积木一样存放,以实现层层调用。程序运行的时候,总是先完成最上层的调用,然后将它的值返回到下一层调用,直至完成整个调用栈,返回最后的结果。
- 从内存区域的角度上理解:是存放数据的一种内存区域。程序运行的时候,需要内存空间存放数据。一般来说,系统会划分出两种不同的内存空间:一种叫做
stack(栈)
,另一种叫做heap(堆)
。
参考链接:Stack的三种含义
(图片均来源于网络)
本文所述是站在数据结构的角度。
栈可以通过链表和数组实现,先看通过数组实现的方式。
可以看到Stack
是Vector
的子类,Vector
本身是一个可增长的线程安全的对象数组( a growable array of objects)
里面主要是如下方法
1 | E push(E item) |
push
1 | /** |
就是调用了Vector
的addElement
1 | /** |
就是判断是否扩容,然后赋值即可
pop
和peek
1 | /** |
Vector
中
1 | /** |
先调用peek()
得到需要出栈的对象,也就是数组顶部的对象,在调用Vector
的removeElementAt
移除。
empty
1 | /** |
search
1 | /** |
参考链接:
java.util.Stack类简介
1 | private Node top = null; |
入栈:将top
的指向换为入栈的对象,然后将这个入栈的对象指向上一个入栈的对象即可。
代码表示:
1 | public void push(T node) { |
出栈:根据出栈的对象得到next
,然后top
指向即可。
代码表示:
1 | public T pop() { |
一个伪代码类表示:
1 | /** |
参考连接:
浅谈算法和数据结构: 一 栈和队列
水平有限,文中有什么不对或者有什么建议希望大家能够指出,谢谢!
v1.5.2