• 大话数据结构----循环队列和链式队列


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

    队列的特点就是:先进先出,和生活中排队的例子是很先进的,排队的目的不就是先到先得吗。

    队列

    生活中的队列相当于顺序存储的队列,在火车站排队买票,前面的人买完票走了,后面的人一个一个往前移一位,这是很正常的事情,而计算机中队列队列第一个元素出去了,后面的元素一个一个往前移,这是一件很降低效率的一件事。为了解决这种效率问题,计算机采用循环队列的方式操作队数据。

    循环队列

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

    1.首先循环队列依旧是顺序存储结构:在内存中开辟一段连续的空间,头指针和为指针重合,也就是front==rear。

    队空或者初试情况

    2.入队的时候排在最后一个元素的后面,也就是每次放在rear所指的位置,然后rear指向后面的位置

    插入

    3.出队情况是队列最前一个元素出队,与顺序存储的区别是其他元素不需要往前移位,而是每个元素还在自己的位置上,只是指向对头的指针指向现在的对头

    循环丢咧

    4.那循环队列是如何实现循环的呢,如下图,当后面没有地方放元素,就可以从前面在开始放元素,front指向的仍然是对头,rear执行的仍然是队尾;即每次入队的时候,rear不是要指向后面一个位置吗,通过rear=(rear+1)%QueueSize来实现,就能达到循环。

    循环继续

    5.怎么判断队满?

    队满的情况

    当(rear+1)%QueueSize==front时,就说明队满了,也就是rear不能再往后退了,再退就与front重合了。因为rear==front的时候是空队列,为了与空队列区分开,让rear指向front前一个位置的时候规定为队满情况。

    Java实现队列数据结构

    package com.neuedu.roundQuery;
    /* 
    * 项目名称:JavaQuery 
    * @author:wzc
    * @date 创建时间:2017年9月9日 下午2:45:24
    * @Description:循环队列
    * @parameter  
    *   */
    
    public class RoQueue {
        public static int QueueSize=10;
        public int date[]=new int[QueueSize];
        public int front;
        public int rear;
        public RoQueue() {
            front=0;
            rear=0;
        }
        ///判断队列是否为空
        public boolean isEmpty(){
            if(front==rear){
                return true;
            }
            return false;
        }
        //判断队列是否满;
        public boolean isFull(){
            if ((rear+1)%QueueSize==front) {
                return true;
            }
            return false;
        }
        //入队操作
        public void add(int date){
            //判断队列是否为满
            if (isFull()) {
                System.out.println("队列已满");
                return;
            }else{
                this.date[rear]=date;
                rear=(rear+1)%QueueSize;
                System.out.println(date+"加入队列");
            }
        }
        //出队操作
        public int delete(){
            int date=0;
            //判断队列是否为空
            if (isEmpty()) {
                System.out.println("队列中已没有数据");
                return -1;
            }else{
                date=this.date[front];
                front=(front+1)%QueueSize;
                System.out.println(date+"出队");
                return date;
            }
        }
        //获取队列中当前数据个数
        public int getLength(){
            //获取数据个数
            return(rear-front+QueueSize)%QueueSize;
        }
        //获取队列中的第几个数
        public int getIndexDate(int index){
             int length = getLength();
             if (index>=0&&index<length) {
                return date[front+index];
            }
             return -1;
        }
        //输出队列中的所有数
        public void  getDate(){
             int length = getLength();
                 for(int i=0;i<length;i++){
                     System.out.print(date[front+i]+" ");
                 }
                System.out.println();
        }
    }

    链式存储队列

    链式存储队列实际就是单链表,只不过呢只能先进先出而已,也就是每次只能删除队头结点,只能在队尾结点后面插入新结点

    链式

    入队

    入队

    出队

    出队

    代码实现可以参照单链表。

  • 相关阅读:
    py2exe
    Microsoft Visual C++ Compiler for Python 2.7
    BeautifulSoup-find,findAll
    用vc生成可被python调用的dll文件
    xp下安装jdk8
    jython安装
    java java.lang.NoClassDefFoundError 的解决办法
    Python聊天室
    我的IOT入门课程上线了。
    Mybatis的CRUD操作
  • 原文地址:https://www.cnblogs.com/Actexpler-S/p/7498617.html
Copyright © 2020-2023  润新知