近日,看到大家在网上分析了很多关于堆栈的面试题,有些挺有意思,本文将对三种不同类型的堆栈面试题进行分析和实现。其中有部分代码思想是借鉴别人的,我会做专门标准。
类型1:堆栈排序之双栈排序
我认为双栈排序的思想比较精妙,写完代码之后有种静脉被打通的感觉。代码并非复杂,但是需要建立在堆栈的深刻理解的基础上。这个时候就看算法的智慧迸发了。废话不多说,下面阐述下题目以及思路。
假如给定一组序列:2,1,3. 该序列存放在一个栈S1里。
要求对其进行排序。
我们可以采用辅助栈S2,并将排序后的S2返回即可。
(1)伪码:
while s1非空{
temp=s1.pop();
将s2中比TEMP大的元素全部压回S1栈。
将temp压入s2
}
(2)过程
s1 | s2 | temp | comment |
2,1,3 | <> | 0 | 取出栈顶元素放入temp=3,此时s2为空,入栈 |
2,1 | <3> | 3 | 将S2大于temp的栈顶元素全部入栈S1,并将temp压入S2 |
2 | <3> | 1 | 将S2大于temp的栈顶元素全部入栈S1,并将temp压入S2 |
2,3 | <1> | 3 | 此时temp大于1,将temp入栈s2 |
<1,3> | 2 | 将S2大于temp的栈顶元素全部入栈S1,并将temp压入S2 | |
3 | <1,2> | 2 | |
<1,2> | 3 | temp>s2栈顶元素,将temp压入S2 | |
<1,2,3> | 3 | s1为空,结束 | |
(3)代码:(该代码直接在Notepad上打出来,未经过测试)
public static Stack<Integer> StackSort(Stack<Integer> s1){
Stack<Integer> s2 = new Stack<Integer>();
int temp = 0;
while(!s1.isEmpty()){
temp = s1.pop();
while(!s2.isEmpty()&&s2.peek()>temp)
s1.push(s2.pop());
s2.push(temp);
}
return s2;
}
(未完待续)
类型2:堆栈排序之递归
类型3:判断堆栈push序列和pop序列
类型4:双栈实现队列
类型5:双队列实现堆栈
类型6:在堆栈中取最小值