数据结构学习之队列基本操作
数据结构学习之队列基本操作
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 结果如下
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 结果如下
0x3.2 总结
在原来基础上进行%MaxSize操作,确保进位。q->front
指向的是队头元素的前一个,q->rear
指向的是队尾元素。循环队列的长度计算公式为:(q-rear+MaxSize-q->front)%MaxSize