数据结构学习之队列基本操作

数据结构学习之队列基本操作

0x1 问题描述

​ 队列的基本运算算法设计

0x2 顺序队列代码如下

#include <iostream>
#include <cstdio>
#include <cstdlib>
#define MaxSize 100000+7

using namespace std;
typedef int ElemType;
//顺序队列
typedef struct
{
    ElemType data[MaxSize];
    int front,rear;

}SqQueue;

// 初始化队列
void InitQueue(SqQueue *&q)
{
    q=(SqQueue *)malloc(sizeof(SqQueue));
    q->front=q->rear=-1;
}

// 销毁队列
void DestroyQueue(SqQueue *&q)
{
    free(q);
}

//判断队列是否为空
bool QueueEmpty(SqQueue *q)
{
    return(q->front==q->rear);
}

//进队列
bool enQueue(SqQueue *&q,ElemType e)
{
    if(q->rear==MaxSize-1)
    {
        return false;
    }
    q->rear++;
    q->data[q->rear]=e;
    return true;
}

// 出队列
bool deQueue(SqQueue *&q,ElemType &e)
{
    if(q->front==q->rear)
        return false;
    q->front++;
    e=q->data[q->front];
    return true;
}
int main()
{
    SqQueue *q;
    InitQueue(q);
    int a[5]={1,2,3,4,5};
    for(int i=0;i<5;i++)
    {
        enQueue(q,a[i]);
    }
    while(!QueueEmpty(q))
    {
        int e;
        deQueue(q,e);
        cout<<e<<" ";
    }
    cout<<endl;
    DestroyQueue(q);
    return 0;
}

0x2.1 结果如下

image-20190403154633296

0x2.2 总结

​ 进队的时候要判断队列是否为满,出队的时候要判断队列是否为空。

​ 结构体-> 数据+(头下标+尾下标)

​ 长度计算公式:q->rear-q->front

0x3 循环队列代码如下

#include <iostream>
#include <cstdio>
#include <cstdlib>
#define MaxSize 5

using namespace std;
typedef int ElemType;
//环形队列
typedef struct
{
    ElemType data[MaxSize];
    int front,rear;
}QuType;

//初始化队列
void InitQueue(QuType *&q)
{
    q=(QuType *)malloc(sizeof(QuType));
    q->front=q->rear=0;
}

// 销毁队列
void DestroyQueue(QuType *&q)
{
    free(q);
}

// 判断队列是否为空
bool QueueEmpty(QuType *&q)
{
    return(q->front==q->rear);
}

// 进队
bool enQueue(QuType *&q,ElemType e)
{
    if((q->rear+1)%MaxSize==q->front)
        return false;
    q->rear=(q->rear+1)%MaxSize;
    q->data[q->rear]=e;
    return true;
}

// 出队
bool deQueue(QuType *&q,ElemType &e)
{
    if(q->front==q->rear)
        return false;
    q->front=(q->front+1)%MaxSize;
    e=q->data[q->front];
    return true;
}
int main()
{
    QuType *q;
    InitQueue(q);
    int a[5]={1,2,3,4};
    for(int i=0;i<5;i++)
    {
        enQueue(q,a[i]);
    }
    while(!QueueEmpty(q))
    {
        int e;
        deQueue(q,e);
        cout<<e<<" ";
    }
    cout<<endl;
    DestroyQueue(q);
    return 0;
}

0x3.1 结果如下

image-20190403155150345

0x3.2 总结

​ 在原来基础上进行%MaxSize操作,确保进位。q->front指向的是队头元素的前一个,q->rear指向的是队尾元素。循环队列的长度计算公式为:(q-rear+MaxSize-q->front)%MaxSize

猜你喜欢

转载自www.cnblogs.com/xq17dog/p/10649431.html