普林斯顿公开课 算法2-9:队列

接口


队列的接口和栈的接口是类似的


  • enqueue();

  • dequeue();

  • isEmpty();


链表方式实现


队列需要两个指针,记录头和尾。出队时与栈是一样的,入队的时候在结尾增加一个节点。


代码

public  class  LinkedQueue<T> {
     private  class  Node {
         public  T value;
         public  Node next;
     }
 
     private  Node first;
     private  Node last;
 
     public  LinkedQueue(){
     }
 
     public  void  enqueue(T value){
         Node node =  new  Node();
         node.value = value;
         node.next =  null ;
 
         if (isEmpty()){  // 处理队列为空的特殊情况
             first = node;  // 注意第一个节点
             last = node;
         else  {
             last.next = node;
             last = node;
         }
     }
 
     public  T dequeue(){
         T result = first.value;
         first = first.next;
 
         if (isEmpty()){  // 处理队列为空的特殊情况
             last =  null ;
         }
 
         return  result;
     }
 
     public  boolean  isEmpty(){
         return  first ==  null ;
     }
}


数组方式实现


队列也可以使用数组方式实现,当数组的使用率小于25%时,就重新调整数组的大小


代码


public  class  ArrayQueue<T> {
     private  Object[] s;
     private  int  head;
     private  int  tail;
 
     public  ArrayQueue(){
         s =  new  Object[ 2 ];
     }
 
     public  void  enqueue(T item){
         // 如果数组已满,调整数组
         if (s.length == tail){
             resize(s.length* 2 );
         }
 
         // 添加到数组的末尾
         s[tail] = item;
         tail++;
     }
 
     public  T dequeue() {
         // 返回的结果应该是队列的头部
         Object result = s[head];
         head++;
 
         // 如果队列使用率不到1/4,则调整数组大小
         int  size =  this .size();
         if (size >=  2  && size < s.length/ 4 ){
             resize(s.length/ 2 );
         }
 
         // 返回结果
         return  (T)result;
     }
 
     private  void  resize( int  size){
         //复制一份新的数组
         Object[] copy =  new  Object[size];
         int  queueSize =  this .size();
         for ( int  i= 0 ;i<queueSize;i++){
             copy[i] = s[i+head];
         }
         s = copy;
 
         // 重置指针
         head= 0 ;
         tail=queueSize;
     }
 
     // 队列长度
     private  int  size() {
         return  tail-head;
     }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值