题目
按升序对栈进行排序,最多只能使用一个额外的栈存放临时数据,但不得将元素复制到另外的数据结构中(如数组)。该栈只支持如下操作:push、pop、peek和isEmpty。
代码
package test1;
import java.util.Random;
import java.util.Stack;
public class MyStack {
public Stack<Integer> stack;
public MyStack() {
stack = new Stack<>();
}
public Stack<Integer> sort() {
if (stack.isEmpty()) {
return null;
}
Stack<Integer> extraStack = new Stack<>();
int tmpS = 0;
int maxInExtra = 0;
/**
* 从栈中pop出一个元素tmpS,将其与extraStack的栈顶元素进行比较,如果tmpS大,则可以直接push到extraStack;
* 如果小,则将extraStack的栈顶元素压入栈
*/
while (!stack.isEmpty()) {
tmpS = stack.pop();
if (extraStack.isEmpty()) {
extraStack.push(tmpS);
} else {
maxInExtra = extraStack.peek();
while (tmpS < maxInExtra && !extraStack.isEmpty()) {
stack.push(extraStack.pop());
}
extraStack.push(tmpS);
}
}
stack = extraStack;
return extraStack;
}
public void display() {
for (Integer integer : stack) {
System.out.printf("%-4s", integer.toString());
}
}
}
测试
public static void main(String[] args) {
MyStack myStack = new MyStack();
Random random = new Random();
for (int i = 0; i < 10; i++) {
myStack.stack.push(random.nextInt(20));
}
myStack.sort();
myStack.display();
}
0 1 1 2 4 11 14 15 17 19