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

队列(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();
    }
}

 

链式存储队列

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

链式

入队

入队

出队

出队

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

posted @ 2017-09-09 16:41  Actexpler  阅读(1721)  评论(0编辑  收藏  举报