双栈排序java_双栈排序

23

思路:

1.先看下图

d8f7a9cea8cb26c595ffe28c2f37c767.png

初始栈initStack中存放的数组中待排序的数;临时栈tempStack中存放的是已经排好序的数。

现在继续对初始栈中的数进行排序,5应当插入到临时栈哪个位置?

2. 5应该插入到8下,3上。

具体如何操作呢?

首先初始栈initStack弹出待排序的数5,存入变量tmp;而临时栈tempStack弹出比5大的数,并存入初始化栈initStack中。如下图:

27ef9c3fa925a9ae70dcc506e81bea74.png

3. 将变量tmp保存的数插入到临时栈tempStack中去,由于初始化栈initStack中8,12是排好序的,可以再直接弹入临时栈中,再对下一个数10进行如上操作。

00c946bf3c2ccea4864614770f01ae54.png

代码如下:

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&ltint>),其中第一个元素为栈顶”的意思来,这里的第一个元素应该是指数组的第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:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值