为什么叫stack栈别名是——弹匣子呢?last in first out后进先出
定义术语:栈(stack)是仅限于在表尾进行删除和插入的线性表
其中允许进行插入和删除操作的表尾——栈顶top
另一端——栈底bottom
1.1 stack栈的应用-递归
经典回顾:斐波那切数列(Fibonacci)
兔子繁殖问题:
所经过的月数 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | … |
---|---|---|---|---|---|---|---|---|---|---|---|
兔子对数 | 1 | 1 | 2 | 3 | 5 | 8 | 13 | 21 | 34 | 55 | … |
有一个明显的规律:前面相邻两项之和 构成后面一项,如果用数学公式表示为:
F
(
n
)
=
{
0
,
n
=
0
1
,
n
=
1
F
(
n
−
1
)
+
F
(
n
−
2
)
,
n
>
1
\textcolor{aqua}{F(n)=\begin{cases} 0, &\ n=0 \\ 1, &\ n=1 \\ F(n-1)+F(n-2), &\ n>1 \end{cases}}
F(n)=⎩⎪⎨⎪⎧0,1,F(n−1)+F(n−2), n=0 n=1 n>1
// Java实现如下
private static int myFbi(int i){
return (i<2) ? i:myFbi(i-1)+myFbi(i-2);
}
public static void main(String[] args) {
List<String> list = new ArrayList<>();
for (int i = 0; i < 10; i++) {
list.add(String.valueOf(myFbi(i)));
}
System.out.println(list.stream().collect(Collectors.joining("->")));
}
// print result
0->1->1->2->3->5->8->13->21->34
总结:递归能够使代码简洁,看起来很装B,但是大量的递归会建立大量的函数副本,
从而消耗大量的时间和内存;迭代和递归的区别:
迭代是循环结构,不需要建立函数副本;递归是顺序选择结构;应该视情况选择。
那说到现在 递归和栈有啥联系啊?(手动黑人问号)
其实这个就深入编译器了,在递归回退过程当中,要执行包括回复前行过程当中存储起来的数据,
并且在后面又以存储的逆序恢复这些数据,这个跟栈的性质相符。
1.2 队列queue
Queue队列: 只允许在一端进行插入,另一端进行删除操作的线性表FIFO(First In First Out)
队尾:允许插入的一端
队头:允许删除的一端
比如我们电脑上的记事本就是队列的典型应用
下课!