博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Algs4-1.3.33一个双向队列Deque-双向链表实现
阅读量:6976 次
发布时间:2019-06-27

本文共 2934 字,大约阅读时间需要 9 分钟。

1.3.33Deque。一个双向队列(或者称为deque)和栈或队列类似,但它同时支持在两端添加或删除元素。Deque能够存储一组元素并支持表1.3.9中的API:
表1.3.9泛型双向队列的API
public class Deque<Item> implements Iterable<Item>
    Deque()//创建空双向队列
    boolean isEmpty()//双向队列是否为空
    int size()//双向队列中的元素数量
    void pushLeft(Item item)//向左端添加一个新元素
    void pushRight(Item item)//向右端添加一个新元素
    Item popLeft() 从左端删除一个元素
    Item popRight()从右端删除一个元素
编写一个使用双向链表实现这份API的Deque类。
答:
图片
import java.util.Iterator;
public class Deque<Item> implements Iterable<Item>
{
   private class Node
    {
        Item item;
        Node prev;
        Node next;
    }
   
   private int N;
   private Node left;
   private Node right;
  
    public Deque()
    {
        left=null;
        right=null;
        N=0;
    }
   
    public boolean isEmpty()
    {return N==0;}
   
    public int size()
    {return N;}
   
    public void pushLeft(Item item)
    {
        Node oldLeft=left;
        left=new Node();
        left.item=item;
        left.prev=null;
        left.next=oldLeft;
      
        if(isEmpty())
            right=left;
        else
             oldLeft.prev=left;
        N++;
    }
   
    public void pushRight(Item item)
    {
        Node oldRight=right;
        right=new Node();
        right.item=item;
        right.prev=oldRight;
        right.next=null;
        if(isEmpty())
            left=right;
        else
            oldRight.next=right;
           
        N++;
    }
   
    public Item popLeft()
    {
        Item item;
       if(size()==0)
       {
           item=null;
       }
       else if(size()==1)
       {
           item=left.item;
           left=null;
           right=null;
           N--;
       }
       else
       {
           Node oldLeft=left;
           left=left.next;
           left.prev=null;
           oldLeft.next=null;
           item=oldLeft.item;
           N--;
       }
        return item;
    }
   
    public Item popRight()
    {
        Item item;
        if(size()==0)
        {
            item=null;
        }
        else if(size()==1)
        {
            item=right.item;
            left=null;
            right=null;
            N--;
        }
        else
        {
            Node oldRight=right;
            right=right.prev;
            oldRight.prev=null;
            right.next=null;
            item=oldRight.item;
            N--;
         }
        return item;
    }
 
    public Iterator<Item> iterator()  {return new ListIterator();}
   
    private class ListIterator implements Iterator<Item>
    {
        private Node current=left;
        public boolean hasNext(){return current!=null;}
        public void remove(){}
        public Item next()
        {
            Item item=current.item;
            current=current.next;
            return item;
        }//end next
      }//end class ListIterator
   
    public static void main(String[] args)
    {
        Deque<String> q=new Deque<String>();
        In in1=new In(args[0]);
        In in2=new In(args[0]);
        In in3=new In(args[0]);
        In in4=new In(args[0]);
        //pushLeft and popLeft
   
        StdOut.printf("\n---pushLeft and popLeft---\n");
        while(!in1.isEmpty())
        {
            String item=in1.readString();
            q.pushLeft(item);
        }
         while(!q.isEmpty())
        {
        StdOut.print(q.popLeft()+" ");
        }
   
        //pushLeft and popRight
   
        StdOut.printf("\n---pushLeft and popRight---\n");
        while(!in2.isEmpty())
        {
            String item=in2.readString();
            q.pushLeft(item);
        }
        while(!q.isEmpty())
        {
        StdOut.print(q.popRight()+" ");
        }
    
        //pushRight and popLeft
        StdOut.printf("\n---pushRight and popLeft---\n");
        while(!in3.isEmpty())
        {
            String item=in3.readString();
            q.pushRight(item);
        }
        while(!q.isEmpty())
        {
        StdOut.print(q.popLeft()+" ");
        }
     
        //pushRight and popRight
        StdOut.printf("\n---pushRight and popRight---\n");
        while(!in4.isEmpty())
        {
            String item=in4.readString();
            q.pushRight(item);
        }
        while(!q.isEmpty())
        {
        StdOut.print(q.popRight()+" ");
        }
 
    }
}

转载于:https://www.cnblogs.com/longjin2018/p/9854309.html

你可能感兴趣的文章
Jquery - Select 和 Checkbox 、Textarea的操作
查看>>
单身狗如何搞定一起合租的女生?(有亮点)
查看>>
VS联调多个解决方案的项目
查看>>
MyISAM和InnoDB
查看>>
Verified Boot
查看>>
ArcGIS Engine空间高效查询(IIdentify方法)-已解决(转载)
查看>>
微信公众号支付JSAPI,提示:2支付缺少参数:appId
查看>>
Python中用datetime包进行对时间的一些操作
查看>>
linux查看cpu、内存、版本信息
查看>>
一个简单代码的不简单实现
查看>>
Linux PHP 编译参数详解(二)
查看>>
一步步开发自己的博客 .NET版(11、Web.config文件的读取和修改)
查看>>
这些孩子在 Ubuntu 的 Linux 终端下玩耍
查看>>
Linux服务器jps报process information unavailable
查看>>
权限管理AppOpsManager
查看>>
oracle linux 安装过程错误 :Error in invoking target ‘agent nmhs’ of makefile
查看>>
Atitit.常见软件 数据 交换格式 标准
查看>>
(转)如何在maven的pom.xml中添加本地jar包
查看>>
2016年09月编程语言排行榜
查看>>
配置Supervisor开机启动
查看>>