23
思路:
1.先看下图
初始栈initStack中存放的数组中待排序的数;临时栈tempStack中存放的是已经排好序的数。
现在继续对初始栈中的数进行排序,5应当插入到临时栈哪个位置?
2. 5应该插入到8下,3上。
具体如何操作呢?
首先初始栈initStack弹出待排序的数5,存入变量tmp;而临时栈tempStack弹出比5大的数,并存入初始化栈initStack中。如下图:
3. 将变量tmp保存的数插入到临时栈tempStack中去,由于初始化栈initStack中8,12是排好序的,可以再直接弹入临时栈中,再对下一个数10进行如上操作。
代码如下:
import java.util.*;
public class TwoStacks {
public ArrayList twoStacksSort(int[] numbers) {
ArrayList list = new ArrayList();
//构建栈,并初始化栈
Stack initStack = new Stack<>();
for (int i = 0 ; i < numbers.length; i++){
initStack.push(numbers[i]);
}
//构建辅助栈,用来存放排好序的数
Stack tempStack = new Stack<>();
while(!initStack.isEmpty()){
if (tempStack.isEmpty()){
tempStack.push(initStack.pop());
}else {
//新建变量,存储原始栈中待排序的栈
int tmp = initStack.pop();
//将辅助栈中的排好序中的大于tmp的数放入原始栈中
while (!tempStack.isEmpty() && tempStack.peek() > tmp){
initStack.push(tempStack.pop());
}
//辅助栈存储之前保存的变量
tempStack.push(tmp);
}
}
while(!tempStack.isEmpty()){
list.add(tempStack.pop());
}
return list;
}
}
发表于 2017-06-22 15:53:11
回复(3)
9
如果严格按照题目中“给定一个int[]
numbers
(C++中为vector<int>),其中第一个元素为栈顶”的意思来,这里的第一个元素应该是指数组的第0项,即第0项为栈顶元素,那么就应该倒序来push,讨论中很多回答都是正序来push,但这个影响不大。
虽然Java中Stack继承Vector,但既然这里题目主要是考察双栈排序,那就不要用get(),remove(),以及peek()等方法,就只用push()与pop()来完成对栈中元素的操作。
public class TwoStacks {
public ArrayList twoStacksSort(int[] numbers) {
// write code here
ArrayList result = new ArrayList<>(numbers.length);
//初始化原始栈
Stack stack = new Stack<>();
int index = numbers.length - 1;
for (int i = index; i >= 0; i--) {
stack.push(numbers[i]);
}
Stack resultStack = new Stack<>();//额外的栈
while (!stack.empty()) {
if (resultStack.empty()) {
resultStack.push(stack.pop());
} else {
int a = stack.pop();
int b = resultStack.pop();
if (a < b) {
stack.push(b);
while (!resultStack.empty() && a < (b = resultStack.pop())) {
stack.push(b);
}
}
if (a >= b) {
resultStack.push(b);
}
resultStack.push(a);
}
}
//返回ArrayList结果
while (!resultStack.empty()) {
result.add(resultStack.pop());
}
return result;
}
发表于 2016-07-12 15:01: