要求:不能使用其他数据结构,只能使用一个栈加一个新的变量,实现对一个整数类型的栈排序。
package stack;
import java.util.Stack;
/**
* @author:MindMrWang
*2017年11月17日
*:function:利用一个辅助栈和一个变量将一个栈从顶到底从大到小排序
*/
public class sortStackByStack {
public static void main(String[] args) {
Stack<Integer> stack = new Stack<Integer>();
stack.push(2);
stack.push(5);
stack.push(4);//原来的自顶到下的顺序是4,5,2
sort(stack);//如果不进行排序,弹出得到的顺序应该是:4,5,2
while(!stack.isEmpty()) {
System.out.print(stack.pop()+",");
}
}
public static void sort(Stack<Integer> stack) {
Stack<Integer> help = new Stack<Integer>();//新建一个辅助栈
while(!stack.isEmpty()) {//判断当前需要排序的栈不为空
int pop = stack.pop();//将排序的栈顶元素弹出
while(!help.isEmpty()&&help.peek()<pop) {//里面的判断顺序不能颠倒,否则出现 java.util.EmptyStackException
stack.push(help.pop());//当满足help不为空,且help的元素小于pop(这样排出的顺序顶到底是从小到大的)
} //将help里的元素返回到stack中
help.push(pop);//无论什么情况,只要stack不为空,都将pop压入help
}
while(!help.isEmpty()) {//当help不为空的时候,help里面的元素顶到底是从小到大的,
stack.push(help.pop());//所以将help弹到stack中是顶到底是从大到小的
}
}
//最后控制台输出:5,4,2, 证明我们的排序成功了。
}
过程:
①首先help为空,那么直接将stack栈顶的元素4 pop出压入help
②stack不为空,继续将5弹出并保存到pop,比较pop和help里面的4,发现4小,将4返回到stack中,继续将5压入。
③stack不为空,继续将4弹出,和5比较,不满足4>5,接着讲4压入。
④接着同上将2压入。
⑤最后将help内元素弹出压入到stack中。
总结:想让stack自上而下从大到小,所以要将help里自上而下从小到大,每次都将stck(不为空的时候)里的元素弹出并压入help,但是对于已经压入的元素要和新压入的元素进行比较,若新压入的元素大,那么就得让已压入的元素返回到stack中进行重新压入help。这样就实现了help里面自上而下从小到大,也就实现了stack里面自上而下从大到小。
参考文献:《程序员代码面试指南》