栈和队列
一、栈 Stack
1.栈也是一种线性数据结构
规定只能从栈顶添加元素,也只能从栈顶取出元素。
- 栈是一种后进先出的数据结构
- Last In First Out (LIFO)
2.栈的具体实现
Stack< E >
- viod push ( E )
- E pop( )
- E peek( )
- int getSize( )
- boolean isEmpty( )
3.时间复杂度分析
ArrayStack< E >
- void push(E) 0(1)均摊
- E pop( ) 0(1) 均摊
- E peek( ) 0(1)
- int getSize( ) 0(1)
- boolean isEmpty( ) 0(1)
LeetCode -20 有效的括号
二、队列(Queue)
1.队列也是一种线性数据结构
只能从一端(队尾)添加元素,从另一端(队首)取出元素。
队列是一种先进先出的数据结构。
2.队列的实现
Queue< E >
- void enqueue(E)
- E dequeue( )
- E getFront( )
- int getSize( )
- boolean isEmpty( )
3.数组队列的问题
其中dequeue()操作的时间复杂度为O(n),原因时在出队时,数组后面的元素都要进行前移。
删除队首元素
删除队首元素a后
为了解决前移的问题,可以使用front记录队首位置,使用tail记录队尾位置,这就时循环队列。
-
情况1:front == tail 队列为空
-
情况2:
-
情况3:front == tail 队列为空 (tail + 1) % c == front
4.循环队列的复杂度分析
LoopQueue< E >
- void enqueue(E) 0(1)均摊
- E dequeue( ) 0(1) 均摊
- E getFront( ) 0(1)
- int getSize( ) 0(1)
- boolean isEmpty( ) 0(1)
5.性能比较
测试循环队列与数组队列的性能。
6.补充
使用Stream的方式遍历
1、将数组转换为stream,有两种方式:Stream.of(arr),Arrays.stream(arr)
2、使用Arrays.stream( )转换时,如果是包装类,转换后的类型为Stream< Integer >,基础类型,转换后为IntStream
3、使用Stream.of( )转换时,如果是包装类,转换后的类型为Stream< Integer >,基础类型,转换后为Stream< int[ ] >
7.剑指office
【难点:均摊复杂度为 O(1)】
入队操作:
1)最好的情况
从大到小的顺序排列,或从小到大的顺序排列。
例如: 1 2 3 4 5
综上,时间复杂度为O(1)
2)最大的元素在末尾 5 4 3 2 10
依次类推:当最后一个元素最大时,help的复杂度为O(n),前面的都为O(1),
平均计算为 (n-1+n)/n O(1)
3)随机排列 2 3 5 4 10 8 9 15 6