用一个栈实现另一个栈的排序
Posted Tianyiya H.T.W
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用一个栈实现另一个栈的排序相关的知识,希望对你有一定的参考价值。
链接:https://www.nowcoder.com/questionTerminal/ff8cba64e7894c5582deafa54cca8ff2
来源:牛客网
一个栈中元素的类型为整型,现在想将该栈从顶到底按从大到小的顺序排序,只许申请一个栈。除此之外,可以申请新的变量,但不能申请额外的数据结构。如何完成排序?
import java.util.Scanner; import java.util.Stack; public class Main { private static void sort(Stack<Integer> stack) { Stack<Integer> helper = new Stack<>(); while (!stack.isEmpty()) { Integer pop = stack.pop(); while (!helper.isEmpty() && helper.peek() < pop) { stack.push(helper.pop()); } helper.push(pop); } while (!helper.isEmpty()) { stack.push(helper.pop()); } } private static void print(Stack<Integer> stack) { StringBuilder ret = new StringBuilder(); while (!stack.isEmpty()) { ret.append(stack.pop()).append(" "); } System.out.println(ret.toString().trim()); } public static void main(String[] args) { Scanner in = new Scanner(System.in); while (in.hasNext()) { int n = in.nextInt(); Stack<Integer> stack = new Stack<>(); for (int i = 1; i <= n; ++i) { stack.push(in.nextInt()); } sort(stack); print(stack); } } }
心之所向,素履以往 生如逆旅,一苇以航
用一个栈实现对另一个栈的排序
题目
一个栈的元素为整型,现在想将该栈的从栈顶到底按从小到大的顺序排序,只许申请一个栈。除此之外,可以申请新变量,但不能申请额外的数据结构。
难度 ?
思路
- 选择一个stack.pop()弹出的栈(旧栈)顶元素作为比较值,装入到一个新的栈中
- 用新栈的栈顶值比较旧栈再弹出的值
- 如果新栈的值大于旧栈的值,则将旧栈的值装入到新栈中
如果新栈的值小于旧栈的值,则将新栈的值弹出装入到旧栈中
Stack<Integer> help = new Stack<Integer>(); while(!stack.isEmpty()){ int cur = stack.pop(); while(!help.isEmpty() && help.peek()< cur){ stack.push(help.pop()); } help.push(cur); }
流程一
流程二
当新栈不为空时,将新栈的值全部弹出,再装入旧栈中
while (!help.isEmpty()){ stack.push(help.pop()); }
看完上面的图,到这已经很好理解了,没必要在画图了...
实现
package com.test.desc;
import org.junit.Test;
import java.util.Stack;
/**
* @author lorem
* @date 2018.9.11
*/
public class TestStackDesc {
@Test
public void test(){
Stack<Integer> stack = new Stack<Integer>();
stack.push(1);
stack.push(3);
stack.push(2);
sortStackByStack(stack);
while(!stack.isEmpty()){
System.out.println(stack.pop());
}
}
public void sortStackByStack(Stack<Integer> stack) {
Stack<Integer> help = new Stack<Integer>();
while(!stack.isEmpty()){
int cur = stack.pop();
while(!help.isEmpty() && help.peek()< cur){
stack.push(help.pop());
}
help.push(cur);
}
while (!help.isEmpty()){
stack.push(help.pop());
}
}
}
以上是关于用一个栈实现另一个栈的排序的主要内容,如果未能解决你的问题,请参考以下文章