zoukankan      html  css  js  c++  java
  • 大话数据结构八:队列的顺序存储结构(循环队列)

    1. 什么是队列?

    队列(queue)是只允许在一端进行插入操作,而在另一端进行删除操作的线性表。


    2. 队列的特点:

    队列是一种先进先出(First In First out)的线性表,允许插入的一端称为队尾,允许删除的一端称为队头。


    3. 队列顺序存储有什么不足?

    使用数组实现的顺序存储,当做出队列操作时,所有的元素都需要向前移动一位,性能很低。


    4. 什么是循环队列?

    队列头尾相接的顺序存储结构称为循环队列。

    如图所示:front记住队头元素下标,rear记住队尾元素的下一个元素。


    注意:只凭等式front=rear是无法判断队空还是队满,所以我们约定当队列头指针front在队尾指针rear的下一个位置上时,作为队列"已满"的标志也就是说队列满时,数组中还会有一个空闲位置。


    5. Java使用数组实现循环队列:

     

    // 循环队列的顺序存储结构(数组实现)
    public class LoopQueue<T> {
    	private Object[] arr; // 对象数组,队列最多存储
    	private int front; // 记住队首下标位置
    	private int rear; // 记住队尾下标的下一个位置
    	private static final int DEFAULT_SIZE = 3; // 定义数组默认长度
    
    	public LoopQueue() {
    		this(DEFAULT_SIZE);
    	}
    
    	public LoopQueue(int size) {
    		arr = new Object[size];
    		front = 0;
    		rear = 0;
    	}
    
    	// 将元素追加到队列尾部
    	public boolean enqueue(T data) {
    		if ((rear + 1) % arr.length == front) { // 判断队列是否已满
    			return false;
    		}
    		arr[rear] = data; // 将元素data赋值到队尾
    		rear = (rear + 1) % arr.length; // real下标向后移一位,若到最后则转到数组头部
    		return true;
    	}
    
    	// 队列头部的第一个元素出队
    	@SuppressWarnings("unchecked")
    	public T dequeue() {
    		if (rear == front) { // 判断队列是否为空
    			return null;
    		}
    		Object data = arr[front];
    		front = (front + 1) % arr.length; // front下标向后移一位,若到最后则转到数组头部
    		return (T) data;
    	}
    
    	// 获取队列中元素个数
    	public int size() {
    		return (rear - front + arr.length) % arr.length;
    	}
    
    	public static void main(String[] args) {
    		LoopQueue<String> queue = new LoopQueue<String>();
    		System.out.println(queue.enqueue("张三"));
    		System.out.println(queue.dequeue());
    		System.out.println(queue.enqueue("李四"));
    		System.out.println(queue.enqueue("王五"));
    		System.out.println(queue.enqueue("赵六"));
    		System.out.println(queue.dequeue());
    		System.out.println(queue.enqueue("田七"));
    		System.out.println(queue.dequeue());
    		System.out.println(queue.enqueue("周八"));
    	}
    }

    6. 循环队列的不足:

    如果只是顺序存储,算法的性能不咋的,但是循环队列却不得不面临数组可能溢出的问题,有什么好的解决办法吗?

    请见下节(链队列),未完待续 . . .


  • 相关阅读:
    Ubuntu自启动服务脚本
    坑(一)—— Django ORM 连接超时的坑
    logging模块详解
    端口扫描之nmap命令
    端口扫描之masscan扫描
    端口扫描之Scapy模块的使用
    端口扫描之开放端口扫描方式
    Android Studio导入Project、Module的正确方法
    ImportError: No module named 'requests'
    运行python程序
  • 原文地址:https://www.cnblogs.com/riskyer/p/3364667.html
Copyright © 2011-2022 走看看