我需要一个排序堆栈。我的意思是,从堆栈中删除的元素必须是具有高优先级的元素。堆栈尺寸变化很大(变得非常快)。 我还需要搜索该堆栈中的元素。
Java是否为此提供了一些好的实现?你为此建议了什么类或算法?
我现在正在使用PriorityQueue,除了搜索之外,我认为这是合理的,所以我想知道我是否可以使用更好的东西。
我还需要删除元素!
总结:我需要维护一个已排序的堆栈/队列,快速获取具有更高优先级的元素,并尽快删除元素
答案 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
。