Java - 排序堆栈

时间:2010-04-22 19:32:33

标签: java sorting stack queue

我需要一个排序堆栈。我的意思是,从堆栈中删除的元素必须是具有高优先级的元素。堆栈尺寸变化很大(变得非常快)。 我还需要搜索该堆栈中的元素。

Java是否为此提供了一些好的实现?你为此建议了什么类或算法?

我现在正在使用PriorityQueue,除了搜索之外,我认为这是合理的,所以我想知道我是否可以使用更好的东西。

我还需要删除元素!

总结:我需要维护一个已排序的堆栈/队列,快速获取具有更高优先级的元素,并尽快删除元素

5 个答案:

答案 0 :(得分:4)

TreeSet是一个有序集。设置意味着没有重复。 add()添加一个项目,该项目插入到正确的排序位置。 pollLast()删除并返回最后一项, pollFirst()删除并返回第一个项目。

答案 1 :(得分:3)

Java不提供PriorityStack,但您可以通过包装PriorityQueue类并提供push / pop方法来管理底层队列来轻松编写一个。

答案 2 :(得分:1)

import java.util.Stack;

public class Q6_SortStack {

    /**
     * @param args
     * Write a program to sort a stack in ascending order. 
     * You should not make any assumptions about how the stack is implemented. 
     * The following are the only functions that should be used to 
     * write this program: push | pop | peek | isEmpty.
     */
    public static void main(String[] args) {
        int[] array = {2,5,10,3,11,7,13,8,9,4,1,6};
        Stack<Integer> s1 = new Stack<Integer>();
        //int[] array = {2,4,1,6};
        for(int i=0;i<array.length;i++){
            s1.push(array[i]);
        }
        //displayStack(s1);
        displayStack(sortStack(s1));
    }
    public static Stack<Integer> sortStack(Stack<Integer> s1){
        Stack<Integer> s2 = new Stack<Integer>();
        while(!s1.isEmpty()){
            int temp = s1.pop();
            while(!s2.isEmpty() && s2.peek()<temp){
                s1.push(s2.pop());
            }
            s2.push(temp);
        }
        return s2;
    }
    public static void displayStack(Stack<Integer> s){
        while(!s.isEmpty())
            System.out.print(s.pop()+"->");
        System.out.println("end");
    }
}

答案 3 :(得分:0)

您始终可以使用两种数据结构。优先级队列和地图。第一个将让您获得最小/最大的项目,第二个将让您快速搜索项目。你只需要将它们包含在逻辑中以使它们保持在接收器中(这不应该太难)

答案 4 :(得分:0)

您可以修改/重载用于将数据推入堆栈的方法,以便将其插入正确或“已排序”的位置。否则,如果您使用某种原始数据类型的数组实现堆栈,则每次将数据推入堆栈时都可以使用Arrays.sort(*Stack data array goes here*)包中的java.util