数据结构:循环队列及其基本操作的实现


/**
 * 循环队列 * 队列设置first指针直接指向队列头部元素,tail尾指针指向队列最后一个元素的后一个,即队列中总是预留一个空位
 */
class CircleQueue implements Queue<Integer>{

    private Integer[] queueArray = null;

    private int first;

    private int tail;

    private int maxSize;

    public CircleQueue(int max){
        this.maxSize=max+1;
        this.queueArray = new Integer[maxSize];
    }

    @Override
    public int size() {
        return (tail-first+maxSize)%maxSize;
    }

    @Override
    public boolean isEmpty() {
        return tail==first;
    }

    @Override
    public boolean contains(Object o) {
        Integer integer = (Integer)o;
        for (int i = first; i!=tail; i++) {
            if (i==queueArray.length){
                i=0;
            }
            if (integer.equals(queueArray[i])){
                return true;
            }
        }
        return false;
    }

    @Override
    public Iterator<Integer> iterator() {
        return new Iterator<Integer>() {
            int temFirst = first;
            @Override
            public boolean hasNext() {
                return tail!=temFirst;
            }

            @Override
            public Integer next() {
                int num = queueArray[temFirst];
                temFirst = (temFirst+1)%maxSize;
                return num;
            }
        };
    }

    @Override
    public boolean add(Integer integer) {
        if ((tail+1)%maxSize==first){
            System.out.println("队列已满,无法添加");
            return false;
        }
        queueArray[tail]=integer;
        tail = (tail+1)%maxSize;
        return true;
    }

    @Override
    public Integer poll() {
        if(isEmpty()){
            throw new RuntimeException("队列为空");
        }
        int result = queueArray[first];
        first  = (first+1)%maxSize;
        return first;
    }

    @Override
    public Integer peek() {
        return queueArray[first];
    }
}
    public static void main(String[] args) {
        CircleQueue circleQueue = new CircleQueue(5);

        Scanner scanner = new Scanner(System.in);

        while (true){
            System.out.println("1:添加元素");
            System.out.println("2:取出元素");
            System.out.println("3:查看头元素");
            System.out.println("4:遍历队列");
            System.out.println("5:查看元素数量");
            System.out.println("6:是否为空");
            int commend = scanner.nextInt();
            switch (commend){
                case 1:{
                    System.out.println("请输出一个元素");
                    int num = scanner.nextInt();
                    circleQueue.add(num);
                    break;
                }
                case 2:{
                    System.out.println(circleQueue.poll());
                    break;
                }
                case 3:{
                    System.out.println(circleQueue.peek());break;

                }
                case 4:{
                    for (Integer integer : circleQueue) {
                        System.out.printf("%d\t",integer);
                    }
                    System.out.println();
                    break;
                }
                case 5:{
                    System.out.println(circleQueue.size());break;

                }
                case 6:{
                    System.out.println(circleQueue.isEmpty());
                    break;
                }
            }
        }

    }

 
 

原文地址:https://www.cnblogs.com/xxfxxf/p/12175416.html

时间: 2024-10-13 04:17:28

数据结构:循环队列及其基本操作的实现的相关文章

C语言实现循环队列(基本操作及图示)

-------------------------------------------- 如果使用顺序表作为队列的话,当处于右图状态则不能继续插入新的队尾元素,否则会因为数组越界而导致程序代码被破坏. 由此产生了由链表实现的循环队列,只有队列未满时才可以插入新的队尾元素. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

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

队列(Queue) 是只允许在一端进行插入操作,而在另一端进行删除操作的线性表 队列的特点就是:先进先出,和生活中排队的例子是很先进的,排队的目的不就是先到先得吗. 生活中的队列相当于顺序存储的队列,在火车站排队买票,前面的人买完票走了,后面的人一个一个往前移一位,这是很正常的事情,而计算机中队列队列第一个元素出去了,后面的元素一个一个往前移,这是一件很降低效率的一件事.为了解决这种效率问题,计算机采用循环队列的方式操作队数据. 循环队列 队列的头尾相接的顺序存储结构称为循环队列. 1.首先循环

顺序循环队列的基本操作

#include #include #define OK 1 #define ERROR 0 typedef int Status; // Status是函数的类型,其值是函数结果状态代码,如OK等 typedef int QElemType; #define MAXQSIZE 100 // 最大队列长度(对于循环队列,最大队列长度要减1) typedef struct { QElemType *base; // 初始化的动态分配存储空间 int front; // 头指针,若队列不空,指向队列

循环队列的基本操作

主要的功能:1)循环队列的初始化 2)求循环队列的长度 3)循环队列的插入删除操作 4) 判断循环队列是否为空,是否已经满了 5)遍历循环队列 主要的原理: 1)初始化 front = rear = 0; 2)为空  front = rear 3)已满 front=(rear+1)%size 4)  插入 rear = (rear+1)%size 5)删除 front=(front+1)%size 代码如下: /******************************************

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

工程目录结构图: 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; //结点数据域

数据结构-循环队列程序演示

1 /* 2 循环队列需要2个参数来确定: 3 front,rear 4 1)队列初始化 5 front和rear的值都为零 6 2)队列非空 7 front代表的是队列的第一个元素 8 rear代表的是队列的最后一个有效元素 9 3)队列空 10 front和rear的值相等,但不一定是零 11 */ 12 13 14 /* 15 队列 16 定义:一种可以实现先进先出的存储结构 17 分类: 18 静态队列 19 链式队列 20 */ 21 #include <stdio.h> 22 #i

数据结构--循环队列

一.顺序队列的改进 队列元素的出列是在队头,即下标为0的位置,那也就意味着,队列中的所有元素都得向前移动,以保证队列的队头(也就是下标为0的位置)不为空,此时的时间复杂度为0(n). 可有时想想,为什么出队列时一定要全部移动呢,如果不去限制队列的元素必须存储在数组的前n个单元这一条件,出队的性能就会大大增加.也就是说,队头不需要一定在下标为0的位置,比如也可以是a[1]等. 而为了避免当只有一个元素时,队头和队尾重合使处理变得麻烦,引入两个指针,front指针指向队头元素,rear指针指向队尾元

D_S 循环队列的基本操作

//  main.cpp #include <iostream> using namespace std; #include "Status.h" typedef int QElemType; #include "SqQueue.h" int main() { SqQueue Q; QElemType e; InitQueue(Q); EnQueue(Q,1); EnQueue(Q,3); EnQueue(Q,5); EnQueue(Q,7); cout

顺序结构循环队列的基本操作(一)(进队,出队)待优化

#include<stdio.h>#define ElemType int#include<malloc.h>#define MAXSIZE 10typedef struct{ ElemType *data; int front,rear;}Queue;typedef struct BitNode{ ElemType data; struct Bitree *Lchild,*Rchild;}BitNode;Queue Init_queue(Queue Q){ Q.data=(Ele