一、队列
- 队列是只允许在一端进行插入操作,在另一端进行删除操作的线性表
- 先进先出、后进后出、操作受限的线性表
- 允许插入的一端被称为队尾(rear) 允许删除的一端被称为队头(front)
二、循环队列
- 队列头尾相接的顺序结构 ,把整个数组理解成一个圈圈
------->示例代码
!!!头文件
#pragma once
#include <iostream>
#include <stdlib.h>
using namespace std;
typedef int State; //给整形起一个别名 专门用来表示状态
#define State_ok 1
#define State_Fall 0
#define MAX_SIZE 255
typedef struct
{
int id;
char name;
}ElementType;
//循环队列结构
typedef struct {
ElementType data[MAX_SIZE];
int front; //队头指针
int rear; //队尾指针
int length; //队列长度
}SeqQueue;
void Init(SeqQueue *queue);
//队列判断
State IsSeqQueueEmpty(SeqQueue *queue);
State IsSeqQueueFull(SeqQueue *queue);
//入队
State OfferSequeue(SeqQueue *queue, ElementType element);
//出队
State PollSequeue(SeqQueue *queue, ElementType * element);
//打印
void PrintSequeue(SeqQueue *queue);
!!!函数实现
#include <iostream>
using namespace std;
#include"SeqQueue.h"
//初始化
void Init(SeqQueue *queue)
{
if (queue == NULL)
{
queue = (SeqQueue *)malloc(sizeof(SeqQueue));
}
queue->length = 0;
queue->front = 0;
queue->rear = 0;
}
//判断队列是否为空/为满
State IsSeqQueueEmpty(SeqQueue *queue)
{
//如果队头指针和队尾指针相同,队列为空
return queue->front == queue->rear ? State_ok : State_Fall;
}
State IsSeqQueueFull(SeqQueue *queue)
{
if ((queue->rear + 1) % MAX_SIZE == queue->front)
{
return true;
}
else
{
return false;
}
}
//出队和入队
State OfferSequeue(SeqQueue *queue, ElementType element)
{
//队尾插入元素
if (IsSeqQueueFull(queue))
return State_Fall;
queue->data[queue->rear] = element;
queue->rear = (queue->rear + 1) % MAX_SIZE; //因为是循环队列嘛
queue->length++;
return State_ok;
//队头不变
}
State PollSequeue(SeqQueue *queue, ElementType * element)
{
if (IsSeqQueueEmpty(queue))
return State_Fall;
//先取出队头元素
*element = queue->data[queue->front];
//把队头移动向下一位置
queue->front = (queue->front + 1) % MAX_SIZE;
queue->length--;
}
//从数组内部存储角度来讲并没有出队 所以应该是从队头遍历到队尾
void PrintSequeue(SeqQueue *queue)
{
for (int i = queue->front; i < queue->rear; i++)
cout << queue->data[i].id << " " << queue->data[i].name << endl;
}