栈和队列之循环队列的基本实现

这里,我们来学习一下循环队列的基本操作:

创建一个队列

void InitQueue(SqQueue &q)
{
    q.base=(User *)malloc(MAXSIZE*sizeof(int));      //为队列开辟内存空间
    q.fron=q.rear=0;      //队列初始为空队列
}

计算队列的长度

int QueueLength(SqQueue q)
{
    return (q.rear-q.fron+MAXSIZE)%MAXSIZE;
}

入队
 

void EnQueue(SqQueue &q,User user)
{
    if((q.rear+1)%MAXSIZE==q.fron)             //判断是否为空
    {
        cout<<"error"<

出队

User DeQueue(SqQueue &q)
{
    if(q.rear==q.fron)                        //判断是否为空队
    {
        cout<<"error"<

取出队头元素

User GetHead(SqQueue q)
{
    if(q.rear!=q.fron)
    {
        return q.base[q.fron];
    }
}

对比和线性栈的操作,可以看出(这里指线性队列和线性栈):

栈是先进后出,而队列是先进先出。

入栈和出栈只需要移动头指针,而入队需要移动尾指针,出队需要移动头指针。

栈空判断条件是:s.top?=s.base   队空判断条件是:q.fron?=q.rear

栈满判断条件是:s.top-s.base?=s.stacksize    队满判断条件是(q.rear+1)%MAXSIZE?=q.fron

这里附上循环队列的实现代码

#include
using namespace std;
#define MAXSIZE 100
typedef struct
{
    char username[50];
    int id;
}User;
typedef struct
{
    User *base;   //基地址
    int fron;     //头指针
    int rear;     //尾指针
}SqQueue;
//初始化线性队列
void InitQueue(SqQueue &q)
{
    q.base=(User *)malloc(MAXSIZE*sizeof(int));      //为队列开辟内存空间
    q.fron=q.rear=0;      //队列初始为空队列
}
//计算队列的长度
int QueueLength(SqQueue q)
{
    return (q.rear-q.fron+MAXSIZE)%MAXSIZE;
}
//入队
void EnQueue(SqQueue &q,User user)
{
    if((q.rear+1)%MAXSIZE==q.fron)             //判断是否为空
    {
        cout<<"error"<

好了,循环队列的基本操作就说到这里了

你可能感兴趣的:(数据结构)