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还要小。