日月的弯刀  
Where Amazing Happens!

转载请标明出处http://www.cnblogs.com/haozhengfei/p/fcc2d8d8366f0cb1837cefbd077b21f1.html 


双栈排序练习题

 
双栈排序练习
 

第6节 双栈排序练习题

 

请编写一个程序,按升序对栈进行排序(即最大元素位于栈顶),要求最多只能使用一个额外的栈存放临时数据,但不得将元素复制到别的数据结构中。

给定一个int[] numbers(C++中为vector<int>),其中第一个元素为栈顶,请返回排序后的栈。请注意这是一个栈,意味着排序过程中你只能访问到第一个元素。

测试样例:
[1,2,3,4,5]
返回:[5,4,3,2,1]
 
 
 
1
import java.util.*;
2

3
public class TwoStacks {
4
    public ArrayList<Integer> twoStacksSort(int[] numbers) {
5
        //sortList中是排好序的,第一元素为栈底元素(最大的元素),最后一个元素为栈顶(最小的元素)
6
        ArrayList<Integer> sortList = new ArrayList<Integer>();
7

8
        int temp = 0;//临时变量,即当前需要往sortList中加入的元素
9
        int flag = 0;//记录当前遍历的numbers数组下标的位置
10

11
        for(int i=0; i<numbers.length; i++) {
12
            flag = i;
13
            temp = numbers[i];
14
            if(sortList.size() == 0) {
15
                sortList.add(temp);
16
            }
17
            else {
18
                for(int j=sortList.size() - 1; j>=0; ){
19
                    //获得当前sortList中最小的元素
20
                    int minOfsortList = sortList.get(j);
21
                    if(minOfsortList > temp) {
22
                        sortList.add(temp);
23
                        break;
24
                    }else{//否则当前元素比sortList中最后的元素(即已经排好序的最小元素)大
25
                        numbers[flag--] = sortList.remove(j); 
26
                        j--;
27
                        if(j < 0){//此时sortList中已经没有了元素,直接添加
28
                            sortList.add(temp);
29
                            break;
30
                        }
31
                    }
32
                 }
33
                 //说明从排序好的栈(sortList)到原栈(numbers)发生了移动,把发生移动的再移动回来
34
                 if(flag != i){
35
                     for(int k=flag+1; k<=i; k++){
36
                         sortList.add(numbers[k]);
37
                     }
38
                 }
39
            }
40
        }
41
        return sortList;
42
    }
43
}
 
 
您的代码已保存
答案正确:恭喜!您提交的程序通过了所有的测试用例
 
 
posted on 2017-03-18 15:11  日月的弯刀  阅读(1067)  评论(0编辑  收藏  举报