`
128kj
  • 浏览: 605190 次
  • 来自: ...
社区版块
存档分类
最新评论

队列的链式实现(java)

阅读更多
   单链表实现队列,这里采用带头结点的单链表结构。根据单链表的特点,选择链表的头部作为队首,链表的尾部作为队尾。除了链表头结点需要通过一个引用来指向之外,还需要一个对链表尾结点的引用,以方便队列的入队操作的实现。为此一共设置了两个指针,一个队首指针和一个队尾指针,队首指针指向队首元素的前一个结点,即始终指向链表空的头结点,队尾指针指向队列当前队尾元素所在的结点。当队列为空时,队首指针与队尾指针均指向空的头结点。
public class Queue<T> implements QueueInterface<T> {
	
	private Node<T> front;	
        private Node<T> rear;
	private int size;	//队列的大小
	
	public Queue() {
		front=new Node<T>();
                rear=front;
		size = 0;
	}

	//返回队列的大小
	public int getSize() {
		return size;
	}

	//判断队列是否为空
	public boolean isEmpty() {
		return size==0;
	}

	//数据元素e入队
	public void offer(T t) {
		Node<T>  q = new Node<T>(t,null);
		rear.setNext(q);
                rear=q;
		size++;
	}

	//队首元素出队
	public T poll() throws QueueEmptyException {
	   if (size<1)
	      throw new QueueEmptyException("错误,队列为空。");
		Node<T> t = front.getNext();
		front.setNext(t.getNext());
		size--;
                if(size<1){ 
                   rear=front;
                   size=0;
                }
                return t.getData();
		
	}

	//取队首元素
	public T peek() throws QueueEmptyException {
	  if (size<1)
	    throw new QueueEmptyException("错误,队列为空。");
		return front.getNext().getData();
	}
    //测试
     public static void main(String[] args) {  
        Queue<String> queue = new Queue<String>();  
        queue.offer("Hello");  
        queue.offer("World!");  
        queue.offer("你好!");  
        System.out.println(queue.getSize());  
         while(!queue.isEmpty()){  
            System.out.print(queue.poll());  
        }  
        System.out.println();  
        System.out.println(queue.getSize());  
    }  

   
}


interface QueueInterface<T> {
	//返回队列的大小
	public int getSize();
	
	//判断队列是否为空
	public boolean isEmpty();
	
	//数据元素t入队
	public void offer(T t);
	
	//栈顶元素出队
	public T poll() throws QueueEmptyException;
	
	//取队首元素
	public T peek() throws QueueEmptyException;
}

class Node< T> {
    private T data;
    private Node< T> next;

    public Node() {
	this(null,null);
    }

    public Node(T data, Node< T> next) {
        this.data = data;
        this.next = next;
    }
   public T getData(){
       return data;
    }
    public void setData(T data){
        this.data=data;
    }

    public Node<T> getNext(){
        return this.next;
    }

    public void setNext(Node<T> next){
       this.next=next;
   }
 }


//队列为空时出栈或取栈顶元素抛出此异常
class QueueEmptyException extends RuntimeException{
	
	public QueueEmptyException(String err) {
		super(err);
	}	
}



在java jdk中有java.util.Queue接口,用以支持队列的常见操作。该接口扩展了java.util.Collection接口。
  Queue使用时要尽量避免Collection的add()和remove()方法,而是要使用offer()来加入元素,使用poll()来获取并移出元素。它们的优点是通过返回值可以判断成功与否,add()和remove()方法在失败的时候会抛出异常。 如果要使用前端而不移出该元素,使用
element()或者peek()方法。
值得注意的是LinkedList类实现了Queue接口,因此我们可以把LinkedList当成Queue来用。
下载代码:
分享到:
评论

相关推荐

    java队列实现(顺序队列、链式队列、循环队列)

    在Java中,队列的实现主要有三种:顺序队列、链式队列和循环队列。下面我们将详细探讨这三种队列的实现方式。 1. **顺序队列**: 顺序队列通常是基于数组实现的。在Java中,我们可以使用ArrayList或LinkedList来...

    java队列实现方法(顺序队列,链式队列,循环队列)

    Java 中提供了多种实现队列的方法,包括顺序队列、链式队列和循环队列等。下面我们将详细介绍每种队列的实现方法和特点。 一、顺序队列 顺序队列是指使用数组来实现队列的数据结构。它的特点是元素在数组中的位置...

    链式队列实现例子

    JAVA语言实现数据的链式结构 分享下挣挣人气

    链式队列的表示和实现源码

    下面将详细讨论链式队列的表示、实现、以及常用的操作。 首先,我们来看链式队列的表示。链式队列由两部分组成:队头(front)和队尾(rear)。队头指向队列的第一个元素,而队尾指向当前队列的最后一个元素。在...

    链式队列.rar

    在编程语言中,链式队列的实现通常涉及到指针或者引用的概念,例如在C++、C#、Java等面向对象的语言中,可以定义一个节点类(Node)和一个队列类(Queue)。队列类包含对头节点和尾节点的引用,以及相关的操作方法。...

    数据结构:链队列

    本篇文章将详细探讨链队列,包括它的定义、工作原理以及如何在实际编程中实现。 链队列,顾名思义,是基于链表实现的队列数据结构。队列是一种遵循“先进先出”(FIFO,First In First Out)原则的数据结构,类似于...

    java队列Java系列2021.pdf

    Java中的队列是一种数据结构,遵循“先入先出”(FIFO)的原则,主要用于实现生产者消费者模式。队列在并发编程中的应用尤为广泛,因为在多线程环境下,多个生产者或消费者可能同时对队列进行操作,因此线程安全的...

    数据结构——队列的实现

    3. 高级数据结构实现:如Java的`java.util.Queue`接口,提供了多种队列实现,如`ArrayDeque`(基于数组的双端队列)、`LinkedList`(链表实现)等。 队列的应用场景: 1. 打印机任务调度:新任务入队,完成的任务出...

    数据结构关于栈和队列的实现源代码

    例如,可能会有C++、Java、Python或其他语言的实现,每种语言都有其特定的语法和数据结构处理方式。 为了更好地学习和应用这些源代码,你可以: - 分析每个文件的代码结构,了解它们是如何创建、初始化、添加元素...

    约瑟夫环问题用循环队列解决

    用循环队列解决约瑟夫环问题减少用顺序表在出对是循环移动带来的空间复杂度

    迷宫问题用队列解决

    这里提到的"LinkQueue"可能是一个链式队列,它是基于链表实现的队列。链式队列的优点在于插入和删除操作的时间复杂度较低,通常为O(1),因为这些操作仅涉及改变几个指针。在Python中,我们可以使用列表模拟链式队列...

    java零基础自学之栈和队列

    Java提供多种实现队列的方式,如`java.util.LinkedList`可以用来创建双端队列,`java.util.Queue`接口提供了队列的基本操作,而`java.util.concurrent ArrayBlockingQueue`等并发队列类适用于多线程环境。...

    java中LinkedList集合类实现栈和队列.doc

    总之,LinkedList集合类通过其内在的链式结构特性,灵活地支持了栈和队列这两种数据结构的实现,为Java程序员提供了处理动态数据集合的有效工具。理解并熟练掌握这些数据结构的实现,对于编写高效的Java代码至关重要...

    基于Java数组实现循环队列的两种方法小结

    循环队列的实现方法有两种,一种是使用链式存储,另一种是使用数组实现循环队列。在本文中,我们将着重介绍基于Java数组实现循环队列的两种方法。 知识点3:基于Java数组实现循环队列的第一种方法 第一种方法是...

    duilie.rar_先来先服务_先来先服务 操作系统_链式队列

    本压缩包文件“duilie.rar”似乎包含了关于FCFS调度算法及其在链式队列中的实现的详细资料。 首先,我们来理解一下"先来先服务"调度算法。FCFS是最直观的调度方法,它按照进程到达系统的顺序进行处理。一旦一个进程...

    10.链式队列以及优先级队列应用.ppt

    10.链式队列以及优先级队列应用.ppt

    Android之循环队列操作

    在Java或Android环境中,我们可以使用ArrayList或LinkedList等内置数据结构来实现循环队列,但为了更好地控制队列的头部和尾部,我们通常选择自定义一个类来实现。以下是一个简单的循环队列实现: ```java public ...

    基于java数据结构实验 队列实验报告.docx

    在Java编程中,数据结构是实现高效算法的基础,队列是一种基本的数据结构,它遵循“先进先出”(FIFO)原则。在这个基于Java的数据结构实验中,我们专注于队列的实现,特别是顺序队列。实验的主要目的是让学生理解和...

    java实现队列数据结构代码详解

    "java实现队列数据结构代码详解" 本文主要介绍了 Java 实现队列数据结构的代码详解,包括队列结构的介绍、队列实现的代码和队列的应用场景。 队列结构是一种线性结构,具有特殊的运算法则:只能在一端(队头)删除...

Global site tag (gtag.js) - Google Analytics