chenfei0 2020-03-06
一个栈中元素的类型为整型,现在想将该栈从顶到底按从大到小的顺序排序,只许申请一个栈。除此之外,可以申请新的变量,但不能申请额外的数据结构。如何完成排序?
将要排序的栈记为stack,申请的辅助栈记为help,在stack上执行pop操作,弹出的元素记为cur.
一直执行以上操作,直到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
要知道时间复杂度只是描述一个增长趋势,复杂度为O的排序算法执行时间不一定比复杂度为O长,因为在计算O时省略了系数、常数、低阶。实际上,在对小规模数据进行排序时,n2的值实际比 knlogn+c还要小。