数据结构java学习(三)循环队列

@TOC
和栈一样,队列也是表,但是使用队列的特点是先进先出。

队列模型

\(\color{black}{队列的基本操作是入队,它是在表的末端插入一个元素,和出队,它是删除在表开头的一个元素}\)

graph LR
A[<kbd>入队</kbd>] --> b[队列]
b[队列] --> c[<kbd>出队</kbd>]

队列的循环数组实现

  • 实现队列的类
import java.util.Arrays;

/**
 * @author 李正阳
 * @param <E> 泛型存储类型
 */
public class MyArrayQueue<E> implements queue<E> {
    /**
     * @param rear 队尾
     * @param front 队头
     * @param size 数组中现在有多少个元素
     * @param MAX_CAPATIAL 数组的总大小
     * @param array 存储元素的数组
     */
    private int rear;
    private int front;
    private int size;
    private final int MAX_CAPATIAL=10;
    private Object[] array;

    /**
     * 构造方法 初始化数组和相关的值
     */
    public MyArrayQueue(){
        array=new Object[MAX_CAPATIAL];
       rear=0;
       front=0;
       size=0;
    }

    /**
     * 入队方法
     * 先给size遍历加一,如果队列满了,就给size变量减一
     * 若队列未满就给队尾加一赋值
     * @param p 需要入队的元素
     * @return  true 成功入队 false 入队失败
     */
    @Override
    public boolean push(Object p) {
        size++;
        if(isFull()){
            System.out.println("队列满了");
            size--;
            return false;
        }else{
            if(rear>=MAX_CAPATIAL){
                rear=0;
                array[rear++]=p;
            }else{
                array[rear++]=p;
            }
        }
        return true;
    }

    /**
     * 出队方法
     * 先判空再出队
     * @return 出队的泛型类型的元素
     */
    @Override
    public E pop() {
        size--;
        E temp=(E) array[front];
        if(isEmpty()){
            System.out.println("队列为空");
        }else{
            front++;
            if(front>MAX_CAPATIAL){
                front=0;
            }
        }
        return temp;
    }

    /**
     * 表的长度
     * @return 表中有多少哥元素
     */
    @Override
    public int size() {
        return size;
    }

    /**
     * 从表头到表尾输出表中的元素
     */
    @Override
    public void travel() {
        int i=front;

        while (true){
            System.out.print(array[i++]+" ");
            if(i==MAX_CAPATIAL){
                i=0;
            }
            if(i==rear){
                break;
            }
        }
        System.out.println();
    }

    /**
     * 判断表是否为空
     * @return true 表为空 false 表不为空
     */
    @Override
    public boolean isEmpty() {
        if(size==0){

            return true;
        }else{
            return false;
        }
    }

    /**
     * @return 返回队尾元素
     */
    @Override
    public E getRear() {
        return (E) array[rear];
    }
    /**
     * @return 返回队头元素
     */
    @Override
    public E getFront() {
        return (E)array[front];
    }

    /**
     * 判断表是否满了
     * @return true 队列满了 false 队列未满
     */
    private boolean isFull(){
        if(size>MAX_CAPATIAL){
            return true;
        }else{
            return false;
        }
    }

}

  • 实现接口文件
/**
 * 队列的接口
 * @param <E> 泛型类型
 */
public interface queue<E> {
     /**
      * 入队方法
      * @param p
      * @return
      */
     boolean push(E p);

     /**
      * 出队方法
      * @return 返回泛型类型的方法
      */
     E pop();

     /**
      * 表中元素的大小
      * @return
      */
     int size();

     /**
      * 输出表中元素
      */
     void travel();

     /**
      * 判断表是否为空的
      * @return true 表是空的 false 表是非空
      */
     boolean isEmpty();

     /**
      * 获取表尾元素
      * @return 表尾的元素
      */
     E getRear();

     /**
      * 获取表头的元素
      * @return 表头的元素
      */
     E getFront();
}

原文地址:https://www.cnblogs.com/lzy321/p/10799975.html

时间: 2024-08-29 23:56:11

数据结构java学习(三)循环队列的相关文章

数据结构学习之循环队列(顺序存储)

[摘要]队列特性:先进先出(FIFO)--先进队列的元素先出队列.来源于我们生活中的队列(先排队的先办完事). 这样有个缺陷,空间利用率不高,所以我们直接学习循环队列(基于连续内存的). (1)设计队列数据结构 typedef struct _QUEUE_NODE { int* pData; int length;//队列长度 int head ;//队头指针 int tail;//队尾指针 int count;//队列元素当前个数 }QUEUE_NODE; (2)申请队列内存 QUEUE_NO

Java数组实现循环队列的两种方法

用java实现循环队列的方法: 1.增加一个属性size用来记录目前的元素个数.目的是当head=rear的时候,通过size=0还是size=数组长度,来区分队列为空,或者队列已满. 2.数组中只存储数组大小-1个元素,保证rear转一圈之后不会和head相等,也就是队列满的时候,rear+1=head,中间刚好空一个元素:当rear=head的时候,一定是队列空了. import java.io.*; public class QueueArray { Object[] a; //对象数组,

【数据结构之旅】循环队列

说明: 时间关系,这里只给出代码及注释,有空的时候再详细介绍一下代码的实现流程. 1.代码及注释 如下: #include<stdio.h> #include<stdlib.h> typedef char ElemType; typedef struct {    ElemType  *elem;  // 存储空间的基址    int front;        // 队头位标    int rear;         // 队尾位标,指示队尾元素的下一位置    int maxS

队列学习笔记 循环队列

 //循环队列 //CycQueue.h #define QUEUEMAX 15 typedef struct  { DATA data[QUEUEMAX];  //队列数组  int head; //队头  int tail; //队尾  }CycQueue; CycQueue *CycQueueInit () { CycQueue *q; if(q=(CycQueue *)malloc(sizeof(CycQueue))) //申请保存队列的内存  { q->head = 0;  //设置队

Java学习笔记--循环总结

关键字break和continue除了在switch语句中使用break,还可以在一个循环中使用break立即终止该循环. 循环语句有三类: while循环, do-while循环和for循环.循环中需要重复执行的语句所构成的整体称为循环体.循环体执行一次称为循环的一次迭代.无限循环是指循环语句被无限次执行.在设计循环时,既考虑循环控制结构体,还需要考虑循环体.while循环首先检查循环继续条件.如果条件为true,则执行循环体;如果条件为false,则循环体结束.do-while循环与whil

JAVA学习&lt;三&gt;

1.Java中运算符的优先级: 2.条件语句If: 如果 if 条件成立时的执行语句只有一条,是可以省略大括号滴!但如果执行语句有多条,那么大括号就是不可或缺的. public class HelloWorld { public static void main(String[] args) { int one = 20 ; if(one%2==0){ System.out.printf("one是偶数"); } } } 3.Java条件语句之 switch: 1. switch 后面

Java学习(三):Java存储区分类

Java中把存储区分为6类.分别为寄存器(register).栈(stack).堆(heap).静态存储区(static storage).常量存储区(constant storage)以及非随机存取存储区(Non-RAM). 1. 寄存器(register).寄存器与其他的存储区不同,它位于CPU中,所以它是存取速度最快的存储区.但是由于CPU中寄存器的数量是非常有限的,所以寄存器的使用是由CPU按需进行分配.编程的时候我们没有必要去对它进行直接控制.并且在程序中也没办法找到到底什么时候使用了

JAVA学习笔记-循环结构

语法示例:(分清楚他们的区别,while是先判断表达式再开始执行,而do_while是先执行一遍循环体,再进行判断) while(逻辑表达式){                                        do{ //循环体                                 和                   //循环体 //迭代                                                          //迭代 }  

Java学习(三)

·求长宽已定的矩形面积 public class RecArea{ static int area(int a,int b){ int s; s = a * b; return s ; } public static void main (String[]arg){ int result,x = 5,y = 6; result =area(x,y); System.out.println(result); }} 今天学到的知识点 ·实参与形参的传递,main()方法是程序的入口点.(形参/方法类