队列——链式队列

上一篇是对拿数组对顺序队列的实现。https://blog.csdn.net/qq_40301026/article/details/87908936

 主要是链式队列用单链表来实现,说白了还是对单链表的应用。https://blog.csdn.net/qq_40301026/article/details/86768703

为了操作实现方便,这里采用带头结点的单链表结构。链表的头部作为队首,链表的尾部作为队尾。

一共设置两个指针,一个队首指针和一个队尾指针,如图所示。     
 

     

package 队列的实现;

public interface Queue<E> {
	//返回队列大小
	public int getSize();
	
	//判断队列是否为空
	public boolean isEmpty();
	
	//数据元素e入队
	public void enqueue(E e);
	
	//队首元素出队
	public E dequeue();
	
	//取队首元素
	public E peek();
	
	//清空队列
	public void clear();
}
package 队列的实现;

public class Node {
	private Object data;
	private Node next;
	
	public Node() {
		this.data = null;
		this.next = null;
	}
	public Node(Object data) {
		this.data = data;
		this.next = null;
	}
	
	public Object getData() {
		return data;
	}
	
	public void setData(Object data) {
		this.data = data;
	}
	public Node getNext() {
		return next;
	}
	public void setNext(Node next) {
		this.next = next;
	}
	
	
}
package 队列的实现;


/**
 * 队列的实现(使用单链表)
 * 有头结点,一个队首指针front,一个队尾指针rear
 * 在队尾入队,在队首出队,先进先出。
 * @author Administrator
 *
 */
public class LinkedQueue implements Queue{
	private Node head ;//头结点
	private Node front;//队首指针
	private Node rear;//队尾指针
	private int size;//队列大小
	
	public LinkedQueue() {
		this.head =  new Node();
		this.front = head;
		this.rear = head;
	}
	
	public LinkedQueue(Object a) {
		Node head = new Node(a);
		this.front = head;
		this.rear = head;
	}

	@Override
	public int getSize() {
		return size;
	}

	@Override
	public boolean isEmpty() {
		return size==0;
	}

	@Override
	public void enqueue(Object e) {
		Node newnode = new Node(e);//新建一个结点
		rear.setNext(newnode);
		rear = newnode;
		size++;
	}

	@Override
	public Object dequeue() {
		Object temp = null;
		if(size==0) {
			throw new RuntimeException("队列为空!");
		}else {
			temp = front.getNext().getData();//存储队首元素
			//删除链表head后面的第一个结点
			front = head.getNext();//front指向head后面的第一个结点
			head.setNext(front.getNext());
			front.setNext(null);
			front = head;//front归位
			size--;
		}
		return temp;
	}

	@Override
	public Object peek() {
		Object temp = null;
		if(size==0) {
			throw new RuntimeException("队列为空!");
		}else {
			temp = front.getNext().getData();//存储队首元素
		}
		return temp;
	}

	@Override
	public void clear() {
		size = 0;
		front = head;
		rear = head;
		head.setNext(null);
	}

	@Override
	public String toString() {
		StringBuilder sb = new StringBuilder("front-->");
		Node xun = front.getNext();
		while(xun!=null) {
			sb.append(xun.getData()+"-->");
			xun = xun.getNext();
		}
		sb.append("rear");
		return sb.toString();
	}
}

测试:

                                              

​​​​​​package 队列的实现;

public class TestLinkedQueue {
	public static void main(String[] args) {
		LinkedQueue s = new LinkedQueue();
        //入队列
		s.enqueue(1);
		s.enqueue(2);
		s.enqueue(3);
        //打印队列
		System.out.println(s.toString());
		
		//出队列
		System.out.println(s.dequeue());
		
		System.out.println(s.toString());
		
		//返回队首元素
		System.out.println(s.peek());
		
		//是否为空
		System.out.println(s.isEmpty());
		
		//清空队列
		s.clear();
		System.out.println(s.isEmpty());
		System.out.println(s.toString());
		
	}
}

 

                                  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值