C++循环顺序队列

顾名思义:采用顺序结构存放的队列称为顺序队列

循环顺序队列可以避免队列的假溢出现象的发生。如下图示,循环队列的几种特殊情况。

学习完顺序循环队列个人感觉应该注意的事项:

front、rear只是表示在base[i]这个顺序表中的索引值,而不是内存的绝对地址,这样也才在后面的循环的时候处理起来比较方便

队列循环的关键

front=(front+1)%queueSize;

下面是个人的循环队列操作工程文件:

/////////////////////////////////////////////////////////////////////////

//sqQueue.h 

////////////////////////////////////////////////////////////////////////

#ifndef MYHEAD_H
  #define MYHEAD_H
  #include"myhead.h"
#endif

#include<iomanip>

//////////////////////////////////////////////////////////////////////////////

//循环顺序队列数据结构C++类声明(基类)

template <typename ElemType>
class SqQueue
{
public:
    void clear();//把循环顺序队置空
    Status deQueue(ElemType & e);//出队列
    Status enQueue(ElemType & e);//进队列
    Status getFront(ElemType & e);//读循环顺序队列队头的元素
    int getLength();//求循环顺序队中元素个数
    bool isEmpty();//判断循环顺序队是否为空
    bool isFull();//判断循环顺序队是否为满
    SqQueue<ElemType> operator =(SqQueue<ElemType> rightQ);//重载赋值运算符的定义
    void display();
    void randSqueue();

    //****************************下面为系统自动调用构造函数及析构函数声明*************************//
    SqQueue(int size=20);//构造函数
    ~SqQueue();//析构函数
    SqQueue(const SqQueue<ElemType> & otherQ);//拷贝初始化构造函数
protected:
    int rear;
    int front;
    int queueSize;
    ElemType *base;
};

///////////////////////////////////////////////////////////////////////////////////////////////

//循环顺序队列数据结构C++类实现(基类)
template <typename ElemType>
void SqQueue<ElemType>::clear()
{
    front=rear;
}

template <typename ElemType>
Status SqQueue<ElemType>::deQueue(ElemType & e)
{
    if(isEmpty())
        return ERROR;
    e=base[front];
    front=(front+1)%queueSize;
    return OK;
}

template <typename ElemType>
Status SqQueue<ElemType>::enQueue(ElemType &e)
{
    if(isFull())
        return ERROR;
    base[rear]=e;
    rear=(rear+1)%queueSize;
    return OK;
}

template <typename ElemType>
Status SqQueue<ElemType>::getFront(ElemType & e)
{
    if(isEmpty())
        return ERROR;
    e=base[front]
    return OK;
}

template <typename ElemType>
int SqQueue<ElemType>::getLength()
{
    return (rear-front+queueSize)%queueSize;
}

template <typename ElemType>
bool SqQueue<ElemType>::isEmpty()
{
    return rear==front?true:false;
}

template <typename ElemType>
bool SqQueue<ElemType>::isFull()
{
    return (rear+1)%queueSize==front?true:false;
}

///////系统构造函数及析构函数的实现
template <typename ElemType>
SqQueue<ElemType>::SqQueue(int size)
{
    base=new ElemType[size];
    assert(base!=0);

    front=rear=0;

    queueSize=size;

}

template<typename ElemType>
SqQueue<ElemType>::~SqQueue()
{
    delete []base;
}

template<typename ElemType>
SqQueue<ElemType>::SqQueue(const SqQueue<ElemType>& otherQ)
{
    base=new ElemType[otherQ.queueSize];
    assert(base!=0);
    queueSize=otherQ.queueSize;

    front=otherQ.front;
    rear=otherQ.rear;

    for (int i = front;i%queueSize!=rear)
    {
        base[i]=otherQ.base[i];
        i=(i+1)%queueSize;
    }
}

template<typename ElemType>
void SqQueue<ElemType>::display()
{
    int n=getLength();
    cout<<endl;
    cout<<"当前的队列为:"<<endl;
    for (int i = 0; i < n; i++)
    {
        cout<<setw(6)<<base[i+front];
    }
    cout<<endl;
    cout<<setw(6)<<"↑";
    for (int i = 0; i < n-1; i++)
    {
            cout<<setw(6)<<" ";
    }
    cout<<setw(6)<<"↑"<<endl;

    cout<<setw(6)<<"front";
    for (int i = 0; i < n-1; i++)
    {
            cout<<setw(6)<<" ";
    }
    cout<<setw(6)<<"rear"<<endl;

}

template<typename ElemType>
void SqQueue<ElemType>::randSqueue()
{
    ElemType Elem[11];
    srand(unsigned(time(NULL)));
    int n=rand()%10+1;
    cout<<"产生的随机数组是:"<<endl;
    for (int i = 0; i < n; i++)
    {
        Elem[i]=rand()%100+1;
        cout<<setw(6)<<Elem[i];
    }

    for (int i = 0; i < n; i++)
    {
        base[i]=Elem[i];
        rear++;
    }
    display();

}
// SqQueueTest.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include"SqQueue.h"
#include<iostream>
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
    SqQueue<int> SQ(10);
    SQ.randSqueue();
    char YesOrNo=‘Y‘;
    int num,a;
    Status sta;
    while (YesOrNo==‘Y‘||YesOrNo==‘y‘)
    {

        cout<<"1. 进队列:"<<endl;
        cout<<"2. 出队列:"<<endl;
        cin>>num;
        switch (num)
        {
        case 1:
            cout<<"输入进队列的值:"<<endl;
            cin>>a;
            sta=SQ.enQueue(a);
            if (sta==ERROR)
                cout<<"队列已满!!!"<<endl;
            break;
        case 2:
            sta=SQ.deQueue(a);
            if (sta==ERROR)
                cout<<"队列已空!!!"<<endl;
            else
                cout<<"弹出的元素为:"<<a<<endl;
            break;
        default:
            break;
        }
        SQ.display();

        cout<<"是否想要继续?是请输入Y"<<endl;
        cin>>YesOrNo;
    }
    system("pause");
    return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-09 02:32:21

C++循环顺序队列的相关文章

【小白成长撸】--循环顺序队列

1 // 循环顺序队列.cpp : 定义控制台应用程序的入口点. 2 //适合整数 3 4 #include "stdafx.h" 5 #include<stdio.h> 6 7 #define MAXNUM 100 8 #define true 1 9 #define false 0 10 11 typedef struct queue_type 12 { 13 int queue[MAXNUM];//队列的最大值为100 14 int front;//头指针 15 in

数据结构-循环顺序队列的基本操作

//循环顺序队列的基本操作 #include <iostream> #include <string.h> using namespace std; #define MAXLEN 8 #define datatype char #define Status int typedef struct{ datatype s[MAXLEN]; int front; //记录队首的指针 int rear; //记录队尾的指针 }SeqQueue; //初始化 Status InitSeqQu

循环顺序队列

#include<iostream> using namespace std; const int MAXQSIZE = 5; //队列类 template<class T> struct LinkList { T * data;//指向连续的数据存储区域 int front;//头指针 指向第一个元素 int rear;//尾指针 如果队列不为空指向最后元素的下一个位置 }; //构造一个空队列 template<class T> void InitQueue(Lin

数据结构-循环顺序队列&amp;链队列

队列接口实现: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace _003_队列 { interface IQueue<T> { int Count { get; } int GetLength(); bool IsEmpty(); void Clear(); void Enqueue(T it

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

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

数据结构(C实现)------- 顺序队列(循环队列之少用一个存储空间实现) .

上节已经提到有三种方法来实现循环顺序队列,其中第一种设立标识不常用,最常的就是后两种,上一节已经讨论了用计数器来实现循环顺序队列,这节就用第三种方法,也就是少用一个存储空间来实现循环顺序队列,其基本操作和用计数实现类同,下面是具体实现: 顺序队列(循环队列)类型描述: //顺序队列的类型描述 #define MAXSIZE 5 typedef int ElemType; typedef struct{ ElemType *data; int front,rear; }SqQueue; 基本操作:

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

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

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

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

队列的实现:顺序队列

队列也是一种常见的线性表,它和栈相比有以下不同: 队列可以在表的两端进行操作.栈只能在栈顶进行插入和删除. 两端允许操作的类型不一样:可以进行删除的一端称为队头,这种操作也叫出队:可以进行插入的一端称为队尾,这种操作也叫入队.总的来说,队头只能出队,队尾只能入队. 队列的示意图: 模拟队列这种数据结构并不是什么难事,但会遇到一些问题,如: 假溢出 队列中明明还有空间,却因为rear已经指向最后,造成无法入队问题,这是假溢出. 解决办法是:使用链式存储,这显然可以.在顺序存储时,我们常见的解决办法