上次文章说到Java中栈的实现,这次楠哥和大家一起学习Java中队列的实现。事实上,队列(Queue)这种数据结构其实和linklist十分的相似,只是在linklist当中可以直接的获取每一个结点的值,而queue只能从一端获取。严格意义上说,队列有很多种,如FIFO队列(先进先出)、LIFO队列(后进先出)和Priority队列(优先级队列)。通常所说的队列即为FIFO队列,而栈其实就是LIFO队列。对于Priority队列,因为涉及到排序算法,将在本系列文章的后面进行分析。(楠哥计算机学习网www.liubonan.com)
Java有已经写好的Queue类,通常编程当中可以直接使用,本文为了深入分析数据结构的细节,所以自己定义这样一个类。在Java中实现队列,和linklist方法基本一致。Queue类中需要定义两个成员属性header和tail,用于记录队首元素和队尾元素。事实上,可以不记录tail,但是这样的话,会耗费很多的时间用于寻找队尾,对于push操作十分的不合算。Pop,Push和Peek操作与栈的实现基本相似,因为前文中使用char作为数据类型,本次使用int型给出样例代码。(楠哥计算机学习网www.liubonan.com)
package ds;
//楠哥计算机学习网www.liubonan.com
public class Node {
private char data;
private Node next;
public Node (char data)
{
this.setData(data);
this.setNext(null);
}
public char getData() {
return data;
}
public void setData(char data) {
this.data = data;
}
public Node getNext() {
return next;
}
public void setNext(Node next) {
this.next = next;
}
}
//楠哥计算机学习网www.liubonan.com
public class Queue {
private Node head,tail;
public Queue (){}
public void init(char data)
{
head = new Node(data);
tail = head;
}
public void push(char data)
{
Node temp = new Node(data);
tail.setNext(temp);
tail = tail.getNext();
}
public char pop()
{
Node temp = head;
head = head.getNext();
return temp.getData();
}
//楠哥计算机学习网www.liubonan.com
public char peek()
{
return head.getData();
}
public boolean empty()
{
if(head == null)
return true;
else
return false;
}
}
package ds;
//楠哥计算机学习网www.liubonan.com
public class Tester {
public static void main(String[] args)
{
Queue q= new Queue();
String test = "abcdefghijklmn";
q.init(test.charAt(0));
for(int i = 1; i < test.length(); i++)
q.push(test.charAt(i));
while(!q.empty())
{
System.out.print(q.peek()+" ");
System.out.print(q.pop() + " ");
}
}
}