栈和队列最大的不同是,一个先进先出,一个后进先出。
(1)利用两个栈实现一个队列
算法思路:Stack1 放入压在队列中的元素,Stack2用于剔除队列中的元素。当stack2 中不为空时,其顺序即为剔除顺序即可,若为空,将stack1中的元素弹出到stack2中。
(2)包含min函数的栈
1、解法1
借助辅助栈,每次如果元素小于辅助栈内的最小元素,则压栈,否则,将栈底元素压栈。
2、解法2
push(int elem)函数在栈中压入当前元素与当前栈中最小元素的差值,然后通过比较当前元素与当前栈中最小元素大小,并将它们中间的较小值压入。
pop()函数执行的时候,先pop出栈顶的两个值,这两个值分别是当前栈中最小值min和最后压入的元素与栈中最小值的差值diff。如果diff<0,则表示最后压入栈的元素是最小的元素,因此只需将min-diff压入栈中,并将min值返回即可。min-diff就是当前元素弹出后,栈中剩下元素的最小值。而如果diff>=0且栈不为空,则表示当前值不是最小值,所以需要在栈中压入最小值min并将diff+min返回;如果栈为空,则表示已经是最后一个数字,直接返回min即可
clear(): [ ]
push(3): [3 3]
push(4): [3 1 3]
push(2): [3 1 -1 2]
push(5): [3 1 -1 3 2]
push(1): [3 1 -1 3 -1 1]
push(1): [3 1 -1 3 -1 0 1]
push(6): [3 1 -1 3 -1 0 5 1]
push(7): [3 1 -1 3 -1 0 5 6 1]
min() --> 1; pop() --> 7: [3 1 -1 3 -1 0 5 1]
min() --> 1; pop() --> 6: [3 1 -1 3 -1 0 1]
min() --> 1; pop() --> 1: [3 1 -1 3 -1 1]
min() --> 1; pop() --> 1: [3 1 -1 3 2]
min() --> 2; pop() --> 5: [3 1 -1 2]
min() --> 2; pop() --> 2: [3 1 3]
min() --> 3; pop() --> 4: [3 3]
min() --> 4; pop() --> 3: [ ]
(3)括号比配算法
相关代码见:https://github.com/yuanfuqiang456/LeetCode/blob/master/src/String/KuoHao.java
(4)实现一个电梯算法
算法思路:两个栈,一个含min函数,一个含max函数,实现上升下降。
网友评论