顺序队列(数组实现)

下面利用数组实现的循环队列,并考虑了上溢出和下溢出。

public class Queue {
    private int[] queue;
    private static final int defaultSize = 100;
    private int size;
    private int tail, head;
    public Queue() {
        setUp(defaultSize);
    }
    public Queue(int sz) {
        setUp(sz);
    }
    public void setUp(int sz) {
        size = sz; tail = 0; head = 0; queue = new int[size];
    }
    public void enqueue(int x) throws Exception {
        if(isFull()) throw new Exception("overflow");
        else {
            queue[tail%size] = x;
            tail++;
        }
    }
    public int dequeue() throws Exception {
        if(isEmpty()) throw new Exception("underflow");
        else {
            int val = queue[head%size];
            head++;
            return val;
        }
    }
    public int peek() throws Exception {
        if(isEmpty()) throw new Exception("underflow");
        else return queue[head%size];
    }
    public boolean isEmpty() {
        return tail == head;
    }
    public boolean isFull() {
        return (tail + 1)%size == head%size; //设置浪费一个存储空间单元,即head所指的位置仍空闲。
    }
    public void clear() {
        tail = head = 0;
    }
}
时间: 2024-12-22 23:49:49

顺序队列(数组实现)的相关文章

数据结构Java实现07----队列:顺序队列&顺序循环队列、链式队列、顺序优先队列

数据结构Java实现07----队列:顺序队列&顺序循环队列.链式队列.顺序优先队列 一.队列的概念: 队列(简称作队,Queue)也是一种特殊的线性表,队列的数据元素以及数据元素间的逻辑关系和线性表完全相同,其差别是线性表允许在任意位置插入和删除,而队列只允许在其一端进行插入操作在其另一端进行删除操作. 队列中允许进行插入操作的一端称为队尾,允许进行删除操作的一端称为队头.队列的插入操作通常称作入队列,队列的删除操作通常称作出队列. 下图是一个依次向队列中插入数据元素a0,a1,...,an-

数据结构6_顺序队列(循环队列)

本文实现了顺序队列,与链队列不同的是,顺序队列需要考虑一个问题, 问题情况如下, 解决办法:循环队列,当rear到分配的数组空间末尾时,转到数组头 但是当q.rear==q.front时,又如何区分一种是空队列,一种是满队列的情况呢 这里有两种方案 本次代码实现了第一种方法,同时设置了一个技术变量length,稍加改动便可实现第二个方法 代码如下: #include<iostream>using namespace std;//该顺序队列为循环队列,解决队尾指针达到最大值,队列中有空闲单元,但

一步两步学算法之顺序队列

顺序链表代码  非常简单: 但这个代码会有假溢出的状况出现: 就是在队尾已满的情况下,不断出队后 若在此时进行入队操作 判断队列已满的条件是q->head==q->tail 此时这个条件满足. 但实际队列之前已经出队了好几个,前面还有空余空间,这就是假溢出:(原谅我懒得画图) 假溢出解决办法 1.每次出队后 把所有数据都往前移.这种方法要移动大量数据,效率太低. 2.使用循环队列.这种方法明天再打. 1 #define QUEUEMAX 15 2 typedef struct 3 { 4 DA

顺序队列和链式队列的实现

队列是一种常用的数据结构,它跟栈一样,操作都受到限制,队列只允许从一端进数据,另一端出数据.队列跟栈不同,栈是一种"后进先出"的模式,而队列是一种"先进先出"的操作模式.就好比日常排队一样,先排队的先出,后排队的后出.例如,进入队列的顺序是1,2,3,4,5则出队列的顺序是1,2,3,4,5(只考虑一次性出列的情况). 队列也分顺序队列和链式队列,跟顺序栈和链表栈一样,顺序队列同样是基于数组实现,链式队列则是基于链表实现. 顺序队列: //顺序队列 #include

[数据结构]队列之顺序队列的类模板实现

队列是一种限定存取位置的线性表.同意插入的一端叫做队尾(rear),同意删除的一端叫做队首(front). 队列具有FIFO的性质 队列的存储表示也有两种方式:基于数组的,基于列表的.基于数组的叫做顺序队列.基于列表的叫做链式队列. 一下是基于动态数组的顺序队列的模板类的实现. 顺序队列的抽象基类例如以下所看到的:仅仅提供了接口和显式的默认构造函数和析构函数,在派生类中调用. #ifndef QUEUE #define QUEUE //队列的抽象基类 template<class T> cla

数据结构(C实现)------- 顺序队列(循环队列之计数器实现)

为了能充分的利用空间,解决顺序队列的"假溢出"问题,可以采用两种方法:一种是将数据向前移动,让空的存储单元留在队尾:另一种是将顺序队列构造成一个环状的空间,即将队列的数据区data[0....MAXSIZE-1]看成头尾相接的循环结构,使得data[0]接在data[MAXSIZE-1]之后,这就是循环队列. 这节就来实现循环顺序队列. 循环队列中的空闲的空间可以被利用,除非数组空间真的被队列元素全部占用,否则不会上溢.因此,队一此简单的应用外,真正实用的顺序队列是循环队列. 入队时,

数据结构--队列实现(顺序队列和链队列)与C++模板

数据结构--队列实现(顺序队列和链队列)与C++模板 一.顺序队列 队列的顺序存储结构称为顺序队列,顺序队列实际上是运算受限的顺序表. ①和顺序表一样,顺序队列用一个向量空间来存放当前队列中的元素. ②由于队列的队头和队尾的位置是变化的,设置两个指针front和rear分别指示队头元素和队尾元素在向量空间中的位置,它们的初值在队列初始化时均应置为0. 注意: ①当头尾指针相等时,队列为空. ②在非空队列里,队头指针始终指向队头元素,尾指针始终指向队尾元素的下一位置.(所以以下循环顺序队列中当队尾

顺序队列(Sequential Queue)

顺序队列(Sequential Queue) 1. 顺序队列的概念 1.1 顺序队列的定义 顺序队列是基于数组的存储表示实现的队列. 1.2 顺序队列中各元素的逻辑及存储关系 顺序队列可以采用顺序表作为其存储表示,因此,可以在顺序队列的声明中用顺序表定义它的存储空间. 顺序队列可以使用一维数组作为队列的存储空间,存放队列元素的数组的头指针为*elements,该数组的最大允许存放元素个数为maxSize,当前队列的队头位置由数组下标指针front指示,队尾位置由数组下标指针rear指示,如果队列

队列学习笔记 顺序队列

//顺序队列操作 #define QUEUEMAX 15 typedef struct  { DATA data[QUEUEMAX]; // 队列数组  int head;   //队头  int tail;   // 队尾   } SeqQueue; SeqQueue *SeqQueueInit() { SeqQueue *q; if(q=(SeqQueue *)malloc(sizeof)(SeqQueue))   // 申请保存队列的内存  { q->head = 0;  // 设置队头