使用minHeap使用Priority Queue实现的堆栈的预期行为

时间:2016-11-04 22:09:18

标签: java data-structures stack priority-queue min-heap

我对堆和PQ的概念不熟悉。所以我试图使用最小堆使用PQ实现Stack。 我正在尝试实现以下方法:

  1. 弹出
  2. 弹出
  3. 的isEmpty
  4. 尺寸
  5. 以下是代码:

    import java.util.*;
    import java.lang.System;
    public class StackUsingMinPriorityQueue{
        static int a[] = {3,7,2,11,9,4};
        int size = 0;
        PriorityQueue<Integer> pq;
        static StackUsingMinPriorityQueue obj;
        public static void main(String args[]){
    
            obj = new StackUsingMinPriorityQueue(a.length);
            for(int i=0;i<a.length;i++){
                obj.push(a[i]);
            }
    
    
            System.out.println("Value popped: "+obj.pop());
            System.out.println("Value at Top: "+obj.top());
            System.out.println("PQ size: "+obj.size());
            System.out.println("PQ IsEmpty: "+obj.isEmpty());
    
        }
        public StackUsingMinPriorityQueue(int size){
            this.size = size;
            pq = new PriorityQueue<Integer>();
        }
    
        /**
         * 1. PUSH
         * **/
        public void push(int data){
             obj.insert(-System.currentTimeMillis(),data); 
        }
    
         public void insert(long time, int data) {
                pq.offer(data);
        }
    
    
        /**
         * 2. POP
         */ 
        public int pop(){
           return obj.extractMin();
        }
    
        public int extractMin() {
            return pq.poll();
        }
    
        /**
         * 3.TOP
         */
         public int top(){
             return pq.peek();
         }
    
        /**
         * 4. SIZE
         */
         public int size(){
             return pq.size();
         }
    
         /**
          * 5.IsEmpty
          */ 
         public boolean isEmpty(){
             return pq.isEmpty(); 
         }
    }
    
    Output: 
    Value popped: 2
    Value at Top: 3
    PQ size: 5
    PQ IsEmpty: false
    

    现在,我的查询是top = 3 的值。它是否正确 ?它不应该是输入的最后一个值,即4吗?我的理解是,当我们实现一个堆栈时,一个peek应该给出堆栈顶部的元素,该元素应该是4而不是3.

    如果我的实施不正确或是我的理解,有人可以告诉我吗?

1 个答案:

答案 0 :(得分:2)

pq.poll()pq.peek()pq中的最小元素进行操作,而poptop应返回最后插入的元素。

要使用优先级队列实现堆栈,您应该为每个值添加一个键-<insertion time>。您可以使用普通增加计数器作为&#34;计时器&#34;。请注意,这种实现效率非常低。