队列
今天开启算法专栏
今天来看看 一种数据结构:队列
本篇使用数组实现
类似于柜台办理业务,前面的先服务,服务完了后面的接着来。
先来后到,先进先出。
数据结构栈才是先进后出
首先看一下简单的队列数据结构
DataType 类型是int的别名
queue里面存储客户,front负责指向当前的头部,rear指向当前的尾部,宏MAX_SIZE是队列最大长度。
1.初始化队列
头尾指针位置都设置为0
void initQueue(SeqQueue *SQ)
{
SQ->front = SQ->rear = 0;
}
2.检查队列是否为空
当这两个指针相等了说明队列目前就是空的
bool isEmpty(SeqQueue *SQ)
{
if(SQ->front == SQ->rear)
{
return true;
}
return false;
}
3.队列是否满了
当rear等于MAX_SIZE就满了
完整代码实现
#include <iostream>
#include <Windows.h>
using namespace std;
#define MAX_SIZE 5
typedef int DataType; // 队列元素
typedef struct _Queue
{
DataType queue[MAX_SIZE];
int front;
int rear;
}SeqQueue;
// 初始化
void initQueue(SeqQueue *SQ)
{
SQ->front = SQ->rear = 0;
}
bool isEmpty(SeqQueue *SQ)
{
if(SQ->front == SQ->rear)
{
return true;
}
return false;
}
bool isFull(SeqQueue *SQ)
{
if(SQ->rear == MAX_SIZE)
{
return true;
}
return false;
}
// 入队
bool enterQueue(SeqQueue *SQ,DataType data)
{
if(isFull(SQ) || !SQ)
{
cout << "isFull true" << endl;
return false;
}
SQ->queue[SQ->rear] =data;
SQ->rear++;
return true;
}
// 出队
bool DeleQueue(SeqQueue *SQ,DataType *data)
{
if(!SQ || isEmpty(SQ))
{
cout << "Queuq NULL" << endl;
return false;
}
if(!data) return false;
*data = SQ->queue[SQ->front];
for(int i=SQ->front+1;i<SQ->rear; ++i ) // 前移
{
SQ->queue[i-1] = SQ->queue[i];
}
SQ->rear--; // 队尾前移
return true;
}
void printQueue(SeqQueue *SQ)
{
if(!SQ) return ;
int i = SQ->front;
while(i < SQ->rear)
{
cout << SQ->queue[i] << " ";
i++;
}
cout << endl;
}
int main(void)
{
SeqQueue *SQ = new SeqQueue;
DataType data = -1;
initQueue(SQ);
for(int i = 0;i < 7; ++i)
{
cout << "第" << i+1 << "次 " << enterQueue(SQ,i);
cout << endl;
}
printQueue(SQ);
/* -------------------出队---------------------*/
cout << "-----------------出队---------------------------" << endl;
for(int i=0; i< 5; ++i)
{
if(DeleQueue(SQ,&data))
{
cout << "出队成功" << endl;
}
else
{
cout << "出队失败" << endl;
}
}
printQueue(SQ);
delete SQ;
system("pause");
}