队列的顺序存储结构

还是直接上代码

package com.sbtufss.test;

import java.util.Arrays;

/**
 * 所谓的顺序存储结构,实际上就是用数组来存储队列的元素
 * @author sbtufss
 *
 */
public class ArrayQueue<T> {

    private int tLenght=3;//数组的大小,或者每次增加的大小
    //初始化能存放tLenght个元素的数组
    private Object[] t=new Object[tLenght];

    private int front;//对头
    private int rear;//队尾
    private int size;//队列的大小,非常重要,一方面是为了防止指针溢出,另一方面,实际上是记录队列的大小,数组的大小不是队列的大小

    public ArrayQueue(){
        super();
        front=0;
        rear=0;
        size=0;
    }

    /**
     * 数据插入从队尾插入
     * @param data
     */
    public void add(T data){

        t[rear++]=data;
        size++;
        if(size==t.length){//如果队列的大小等于数组的大小,我们要对数组进行扩容之后,再玩里面插入数据
            expansLength();
        }
        if(rear==t.length){
            rear=0;//如果此时的队尾处于数组的最后一位,那么就要将队尾移到第一位
        }
    }

    /**
     * 从队头弹出数据,并且返回该数据,在这里我没有将t[front]赋值为null,是参考了win的删除文件一样,只是把指针移到别的位置,并没有真正的清空
     */
    public T poll(){
        Object o=null;
        if(size>0){
            o=t[front];
            //然后我们就来处理front的数值
            if(front==(t.length-1)){//如果我们读取是是数组的最后一位,那么就队头就移到数组的第一位
                front=0;
            }else{
                front++;
            }
            size--;//返回数值之前要把队列的大小-1
            return (T)o;
        }
        return null;
    }

    public int getSize(){
        return size;
    }

    /**
     * 对数组进行扩容
     */
    private void expansLength(){
        //对数组扩容,我们要在队头和队尾中间插入一定长度的数组
        Object[] copy=new Object[t.length+tLenght];//扩容tLenght个元素
        if(front==0){
            System.arraycopy(t, 0, copy, 0, t.length);
        }else{
            System.arraycopy(t, front, copy, copy.length-size+rear,size-front);
            System.arraycopy(t, 0, copy, 0, rear);
            //重新给front赋值
            front=copy.length-size+rear;
        }
        t=copy;
    }

    @Override
    public String toString() {
        int temp=size;
        int index=front;

        StringBuilder sb=new StringBuilder();
        sb.append("[");
        while(temp>0){
            sb.append(t[index]).append(",");
            if(index==(t.length-1)){
                index=0;
            }else{
                index++;
            }
            temp--;
        }
        if(sb.length()!=1){
            sb.deleteCharAt(sb.length()-1);
        }
        sb.append("]");
        return sb.toString();
    }

    public String toTString(){
        return Arrays.toString(t);
    }

}

我们简单的测试一下

package com.sbtufss.test;

public class Test {

    private static ArrayQueue<Integer> queue=new ArrayQueue<>();

    public static void main(String[] args) {
        queue.add(0);//目前队列中的数据为[0]   数组为[0,null,null]
        queue.add(1);//目前队列中的数据为[0,1]   数组为[0,1,null]
        queue.add(2);//目前队列中的数据为[0,1,2]   数组为[0,1,2,null,null,null]
        //取出先进队列的数,并且删除他(假的删除)
        queue.poll();//目前队列中的数据为[1,2]   数组为[0,1,2,null,null,null]
        queue.add(3);//目前队列中的数据为[1,2,3]   数组为[0,1,2,3,null,null]
        //然后我们在添加两个数,让他们数组自增长
        queue.add(4);//目前队列中的数据为[1,2,3,4]    数组为[0,1,2,3,4,null]
        System.out.println("队列的数据:"+queue);
        System.out.println("队列中数组的数据"+queue.toTString());
        queue.add(5);//目前队列中的数据为[1,2,3,4,5]    数组为[0,1,2,3,4,5]
        queue.add(6);//目前队列中的数据为[1,2,3,4,5,6]    数组为[6,null,null,null,1,2,3,4,5]
        System.out.println("添加5之后队列的数据:"+queue);
        System.out.println("添加5之后队列中数组的数据"+queue.toTString());
    }
}

测试结果

时间: 2024-10-29 11:25:50

队列的顺序存储结构的相关文章

队列的顺序存储结构和链式存储结构

队列(queue)是只允许在一端进行插入操作,而在另一端进行删除操作的线性表(在队尾进行插入操作,在对头进行删除操作). 与栈相反,队列是一种先进先出(First In First Out, FIFO)的线性表. 与栈相同的是,队列也是一种重要的线性结构,实现一个队列同样需要顺序表或链表作为基础. 队列的链式存储结构 队列既可以用链表实现,也可以用顺序表实现.跟栈相反的是,栈一般我们用顺序表来实现,而队列我们常用链表来实现,简称为链队列. typedef struct QNode { ElemT

队列(顺序存储结构)

队列:具有一定操作约束的线性表,只能在一端作插入.删除,与堆栈类似 具有先入先出的特性(First In First Out) 同理,分顺序存储结构.链式存储结构两种形式 队列(顺序存储结构) 通常由一个一维数组和一个队列头元素变量front和一个队列尾元素变量rear组成 加入一个元素rear加1,删除一个元素front加1 空的时候front=rear,但是填满时front/rear也相等,这时便不利于区分:为此通常采用加1求余的方式,同时构成循环队列 1)判断是否为空:front == r

数据结构:队列的顺序存储结构【转】

本文转载自:http://blog.csdn.net/jnu_simba/article/details/8841657 队列(Queue)是只允许在一端进行插入操作,而在另一端进行删除操作的线性表.是一种先进先出的线性表(FIFO).允许插入的一端称为队尾,允许删除的一端称为队头.我们在<栈的顺序存储结构>中发现,栈操作的top指针在Push时增大而在Pop时减小,栈空间是可以重复利用的,而队列的front.rear指针都在一直增大,虽然前面的元素已经出队了,但它所占的存储空间却不能重复利用

数据结构 - 队列静态顺序存储结构

队列的基本概念 1 队列的基本概念 队列(Queue):也是运算受限的线性表.是一种先进先出(First In First Out ,简称FIFO)的线性表.只允许在表的一端进行插入,而在另一端进行删除. 队首(front) :允许进行删除的一端称为队首. 队尾(rear) :允许进行插入的一端称为队尾. 例如:排队购物.操作系统中的作业排队.先进入队列的成员总是先离开队列. 队列中没有元素时称为空队列.在空队列中依次加入元素a1, a2, -, an之后,a1是队首元素,an是队尾元素.显然退

队列的顺序存储结构(循环队列)(C语言实现)

1 #include <stdio.h> 2 #include <stdlib.h> 3 4 #define OK 1 5 #define ERR 2 6 #define TRUE 1 7 #define FALSE 0 8 #define MAXSIZE 4 //定义队列的最大长度 9 10 typedef int status; //定义函数返回的状态,OK & ERR 11 typedef char datatype; //定义队列中每个元素的数据类型,这里暂定为字符

数据结构 --- 循环队列(队列的顺序存储结构)

工程目录结构图: common.h: 1 //#ifndef __common_h__ 2 //#define __common_h__ 3 4 #define OK 1 5 #define ERROR 0 6 #define TRUE 1 7 #define FALSE 0 8 9 #define MAXSIZE 20 10 11 typedef int Status; //函数的返回结果,OK.ERREO.TRUE.FALSE 12 typedef int ElemType; //结点数据域

Java数据结构系列之——队列(1):队列的顺序存储结构及其实现

package queue.sequencequeue; /** * 队列的定义:队列是只允许在一端进行插入操作,而在另外一端进行删除操作的线性表 * 队列是一种先进先出(First In First Out)的线性表,简称FIFO,允许插 * 入的一端称为队尾,允许删除的一端称为队头 * @author wl * */ public class SequenceQueue { private Object[] elementData;//用数组来保存队列的元素 private int fron

Java数据结构系列之——队列(2):循环队列的顺序存储结构及其实现

package queue.circleSequenceQueue; /** * 这里我们规定队列满时数组中还有一个空闲空间,不允许将数组中的空间全部存满 * 循环队列满的条件是:(rear+1)%QueueSize==front * 长度计算公式为:(rear-front+QueueSize)%QueueSize * @author wl */ public class CircleSequenceQueue { Object[] elementData;//数组用于存放队列元素 int fr

(源代码见大话数据结构)线性表—循环队列的顺序存储结构

#include <stdio.h> #include <stdlib.h> #define OK 1 #define ERROR 0 #define TRUE 1 #define FALSE 0 #define MAXSIZE 20 typedef int Status; typedef int QElemType; typedef struct { QElemType data[MAXSIZE]; int front; int rear; }SqQueue; Status In