【算法题】05-用一个栈实现另一个栈的排序
题目
一个栈中元素的类型为整型,现在想将该栈从顶到底按从大到小的顺序排序,只许申请一个栈。除此之外,可以申请新的变量,但不能申请额外的数据结构。如何完成排序?
思路
将要排序的栈记为stack,申请的辅助栈记为help,在stack上执行pop操作,弹出的元素记为cur.
- 如果cur小于或等于help的栈顶元素,则将help直接压入help
- 如果cur大于help的栈顶元素,则将help的元素逐一弹出。逐一压入stack,直到cur小于或等于help的栈顶元素,再将cur压入help
一直执行以上操作,直到stack中的全部元素都压入到help,最后将help中的所有元素逐一压入stack,即完成排序。
实现
代码
package com.zixin.learn;
import java.util.Stack;
/**
* @Desc 用一个栈实现另一个栈的排序 只允许申请一个栈 不允许申请另外的数据结构
* @author sangliping
*
*/
public class StackSortStack {
public static void sortStackByStack(Stack<Integer> stack) {
//申请一个help栈
Stack<Integer> help = new Stack<Integer>();
//数据栈不空的时候
while (!stack.isEmpty()) {
//获得栈顶
int cur = stack.pop();
//如果help的数据不为空,并且help的栈顶元素小于当前元素
while (!help.isEmpty() && help.peek() < cur) {
//将help的元素放入stack
System.out.println(help.peek()+"小于"+cur +"将help的元素放入stack");
stack.push(help.pop());
}
//help为空 或者help的栈顶大于等于当前元素 当前元素放入help栈中
System.out.println((help.isEmpty())?"为空将"+cur+"放入help":help.peek()+"大于等于"+cur +"将"+cur+"放入help");
help.push(cur);
}
//help不为空的时候,将help的元素放入stack中
while (!help.isEmpty()) {
stack.push(help.pop());
}
}
public static void main(String[] args) {
Stack<Integer> stack = new Stack<Integer>();
stack.push(3);
stack.push(1);
stack.push(6);
stack.push(2);
stack.push(5);
stack.push(4);
sortStackByStack(stack);
System.out.println(stack.pop());
System.out.println(stack.pop());
System.out.println(stack.pop());
System.out.println(stack.pop());
System.out.println(stack.pop());
System.out.println(stack.pop());
}
}
输出
为空将4放入help
4小于5将help的元素放入stack
为空将5放入help
5大于等于4将4放入help
4大于等于2将2放入help
2小于6将help的元素放入stack
4小于6将help的元素放入stack
5小于6将help的元素放入stack
为空将6放入help
6大于等于5将5放入help
5大于等于4将4放入help
4大于等于2将2放入help
2大于等于1将1放入help
1小于3将help的元素放入stack
2小于3将help的元素放入stack
4大于等于3将3放入help
3大于等于2将2放入help
2大于等于1将1放入help
6
5
4
3
2
1