数据结构:队列的概念和实现

包括:

一. 队列的概念

二. 顺序存储结构 和 链式存储结构的 队列的实现


一. 队列的概念

        队列即在表的一端进行插入,在表的另一端进行删除。删除的一端称为队头或者队首,插入的一端称为队尾。插入元素称为进队或者入队,删除元素称为出队。特点:先进先出表。队列的存储结构分为顺序存储结构和链式存储结构。 


二. 顺序存储结构 和 链式存储结构的 队列的实现

顺序存储结构的队列实现:

        需要一个数组 和 两个指针(例如 front  和 rear),利用数组存储所有元素,利用两个指针分别指向队首 和 队尾,为了充分使用空间,一般用环形队列,即把队首和队尾连接起来。当从队尾插入元素的时候, 进行 rear = ( rear + 1 ) % MaxSize; 同样,在队首删除元素的时候,也是 front = ( front + 1) % MaxSize;  此时会发现,队空 和 队满都是 rear == front ,为了区别队空 和 队满,通常 少用一个元素,即 (rear + 1)% MaxSize == front 就认为是 堆满,对空的判断条件还是不变, front == rear。

以下为 顺序存储结构的队列的简易实现:

public class SelfQueueImpl {
	private static int dataLength = 2;

	public static void main(String[] args) {
		SqQueue sqQueue = new SqQueue();
		
		sqQueue.enQueue(1);
		sqQueue.enQueue(2);
		sqQueue.enQueue(3);
		
		System.out.println(sqQueue.deQueue());
		System.out.println(sqQueue.deQueue());
		System.out.println(sqQueue.deQueue());
	}
	
	static class SqQueue{
		
		private Object data[] = new Object[dataLength];
		private int front;
		private int rear;
		//进队
		public void enQueue(Object element){
			if(queueIsFull()){
				System.out.println("Queue is full, enQueue failed!.");
			} else {
				data[rear] = element;
				rear ++;
				resetRear(rear);
				System.out.println("enQueue success. data[" + (rear-1) + "] = " + data[rear-1] );
			}
		}

		private void resetRear(int rear) {
			if(rear == dataLength){
				this.rear = 0;
			}
		}
		
		private boolean queueIsFull() {
			return (rear + 1) % dataLength == front;
		}
                //出队
		public Object deQueue(){
			if(queueIsEmpty()){
				System.out.println("Queue is empty, deQueue failed!.");
				return null;
			} else {
				Object object = data[front];
				front ++;
				resetFront(front);
				return object;
			}
		}

		private void resetFront(int front) {
			if(front == dataLength){
				this.front = 0;
			}
		}

		private boolean queueIsEmpty() {
			return rear == front;
		}
		
	}
}

输出为:

enQueue success. data[0] = 1
Queue is full, enQueue failed!.
Queue is full, enQueue failed!.
1
Queue is empty, deQueue failed!.
null
Queue is empty, deQueue failed!.
null


链表存储结构的队列实现:

        对于链表存储结构,就没有循环链表的概念,也没有队满的概念。对于队空,由于队列会维护着 front 和 rear,所以只需要判断其中一个是否为空即可。

以下为 链式存储结构的队列的简易实现:

public class SelfQueueImpl_List {

	public static void main(String[] args) {
		SqQueue sqQueue = new SqQueue();
		
		sqQueue.enQueue(1);
		sqQueue.enQueue(2);
		sqQueue.enQueue(3);
		
		System.out.println(sqQueue.deQueue());
		System.out.println(sqQueue.deQueue());
		System.out.println(sqQueue.deQueue());
		System.out.println(sqQueue.deQueue());
		
	}
	
	static class SqQueue{
		
		private QNode front;
		private QNode rear;
		
		//进队
		public void enQueue(Object object){
			
			if(QueueIsEmpty()){
				insert1(object);
			} else{
				insert2(object);
			}
			System.out.print("enQueue success. Queue is ");
			printQueue();
		}

		private void printQueue() {
			QNode flag = this.front;
			while(flag != null ){
				System.out.print(" " + flag.getObject());
				flag = flag.getNext();
			}
			System.out.print("\n");
		}

		private void insert1(Object object) {
			QNode qNode = new QNode(object);
			this.front = qNode;
			this.rear = qNode;
		}

		private void insert2(Object object) {
			rear.setNext(new QNode(object));
			rear = rear.getNext();
		}

		private boolean QueueIsEmpty() {
			return this.front == null;
		}
		
		//出队
		public Object deQueue(){
			if(QueueIsEmpty()){
				System.out.println("Queue is empty, deQueue failed!.");
				return null;
			} else {
				Object object = front.getObject();
				front = front.next;
				return object;
			}
		}
	}

	static class QNode{
		private Object object;
		private QNode next;
		
		public QNode(Object object){
			this.object = object;
		}
		
		public Object getObject(){
			return this.object;
		}
		
		public QNode getNext(){
			return this.next;
		}
		public void setNext(QNode qNode){
			this.next = qNode;
		}
	}
}
输出为:

enQueue success. Queue is  1
enQueue success. Queue is  1 2
enQueue success. Queue is  1 2 3
1
2
3
Queue is empty, deQueue failed!.
null

下一篇再介绍 Java 的队列体系结构。


参考:java Queue中 remove/poll, add/offer, element/peek区别


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章