问题引入:
假设以一维数组elem[0…m-1]存储循环队列的元素,同时设变量rear和quelen分别指示循环队列中队尾元素的位置和队列中所含元素个数。
(1)说明该队列特点
(2)给出该循环队列的队空、队满条件
(3)编程实现入队列算法
(4)编程实现出队列算法
分析:
结构体:
typedef struct node {
DataType elem[M];
int rear;//队尾指针
int quelen;//元素个数
}SeQueue;
SeQueue Q;
队空条件:Q.quelen == 0
队满条件:Q.quelen == M
代码实现:
LQueue.h:
#pragma once
typedef struct node {
DataType elem[M];
int rear;//队尾指针
int quelen;//元素个数
}SeQueue;
//初始化
void Initiate(SeQueue *Q) {
Q->quelen = 0;
Q->rear = -1;
}
//入队列
int Insert(SeQueue &Q, DataType x)
{
if (Q.quelen == M)//队列已满
{
printf("队列已满!");
return 0;
}
Q.rear = (Q.rear + 1) % M;
Q.elem[Q.rear] = x;
Q.quelen++;
return 1;
}
//出队列
int Delete(SeQueue &Q, DataType *x)
{
if (Q.quelen == 0)//队列已空
{
printf("队列已空!");
return 0;
}
*x = Q.elem[(Q.rear - Q.quelen + 1 + M)%M];
Q.quelen--;
return 1;
}
test.cpp
#include<stdio.h>
#include<stdlib.h>
typedef int DataType;
constexpr auto M = 100;
#include"LQueue.h"
int main() {
int x;
SeQueue Queue;
Initiate(&Queue);
for (int i = 0; i < 10; i++)
{
Insert(Queue, i + 1);
}
int length = Queue.quelen;
printf("出队列的顺序如下:\n");
for (int i = 0; i < length; i++) {
Delete(Queue, &x);
printf("%d ", x);
}
return 0;
}
运行结果
先插入10个元素,再依次出队列