队的基本操作
顺序循环队列的关键语句:
- 队的长度:
(Q.rear-Q.front+MAXQSIZE)%MAXQSIZE;
- 队尾指针加一:
Q.rear=(Q.rear+l)%MAXQSIZE;
- 队头指针加一:
Q.front=(Q.front+l)%MAXQSIZE;
- 判断队满:
(Q. rear+l) %MAXQSIZE==Q. front
- 判断队空:
Q.front==Q. rear
初始化
bool InitQueue(Node *q) {
if (q==NULL)
{
return false;
}
q->elem = (int *)malloc(sizeof(int));
q->front = q->rear = 0;//初始化时将头指针和尾指针指向同一处
return true;
}
进队
bool InsertQueue(Node *q) {
if ((q->rear+1)%MaxSize==q->front)
{
return false;//判断队列是否是满的
}
srand((int)time(0));
for (int i = 0; i < MaxSize-1; i++)
{
q->elem[q->rear] = rand() % 100;
q ->rear = (q->rear + 1) % MaxSize;//队尾指针加一
}
return true;
}
出队
void PushQueue(Node *q ,int *data) {
if (q->front==q->rear)
{
printf("\n队列为空\n");//判断队列是否为空
}
*data = q->elem[q->front];//依次出队,并将头指针加一
q->front = (q->front + 1) % MaxSize;
}
队的长度
int Length(Node *q) {
return (q->rear - q->front + MaxSize) % MaxSize;
}
清空队
void ClearQueue(Node *q) {
q->front = q->rear = 0;//清空时,将队头指针和队尾指针指向同一处
printf("\n全部清空\n");
}
获取队头
int QueueHead(Node *q) {
if (q->front==q->rear)
{
return -1;//判断队列是否为空
}
return q->elem[q->front];
}
遍历队中的元素
void printfQueue(Node *q) {
int i = q->front;
while ((i+q->front)!=q->rear)
{
printf("%d ", q->elem[i]);
i = (i + 1) % MaxSize;//依次遍历
}
printf("\n");
}
代码测试
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#include<time.h>
typedef struct Node {
int *elem;
int front;
int rear;//队列的结构
}Node;
#define MaxSize 20
bool InitQueue(Node *q);//初始化队列
bool InsertQueue(Node *q);//进队
void PushQueue(Node *q,int *data);//出队
void ClearQueue(Node *q);//清空队列
int Length(Node *q);//队列的长度
int QueueHead(Node *q);//返回队头
void printfQueue(Node *q);//遍历队列
int main() {
bool flag = true;
int choice;
int data;
Node *q = (Node *)malloc(sizeof(Node));
while (flag)
{
printf("\n=====循环队列的操作=====\n");
printf("1.队列的初始化\n");
printf("2.入队\n");
printf("3.出队\n");
printf("5.返回队列元素的个数\n");
printf("6.返回队头元素\n");
printf("7.遍历队列\n");
printf("====退出程序按任意值====\n");
printf("输入你的选择:");
scanf("%d", &choice);
switch (choice)
{
case 1:
if (InitQueue(q))
{
printf("\n初始化成功!\n");
}
else {
printf("\n初始化失败!\n");
}
break;
case 2:
if (InsertQueue(q))
{
printf("\n插入成功\n");
}
else {
printf("\n插入失败\n");
}
break;
case 3:
printf("\n出队后的元素:\n");
for (int i = 1; i <MaxSize; i++)
{
PushQueue(q,&data);
printf("%d ", data);
}
break;
case 5:
printf("\n队列的长度为:%d\n", Length(q));
break;
case 6:
if (QueueHead(q)!=-1)
{
printf("\n队头元素为:%d\n", QueueHead(q));
}
else {
printf("\n队列为空\n");
}
break;
case 7:
printfQueue(q);
break;
default:
flag = false;
break;
}
}
}
bool InitQueue(Node *q) {
if (q==NULL)
{
return false;
}
q->elem = (int *)malloc(sizeof(int));
q->front = q->rear = 0;//初始化时将头指针和尾指针指向同一处
return true;
}
bool InsertQueue(Node *q) {
if ((q->rear+1)%MaxSize==q->front)
{
return false;//判断队列是否是满的
}
srand((int)time(0));
for (int i = 0; i < MaxSize-1; i++)
{
q->elem[q->rear] = rand() % 100;
q ->rear = (q->rear + 1) % MaxSize;//队尾指针加一
}
return true;
}
void PushQueue(Node *q ,int *data) {
if (q->front==q->rear)
{
printf("\n队列为空\n");//判断队列是否为空
}
*data = q->elem[q->front];//依次出队,并将头指针加一
q->front = (q->front + 1) % MaxSize;
}
void ClearQueue(Node *q) {
q->front = q->rear = 0;//清空时,将队头指针和队尾指针指向同一处
printf("\n全部清空\n");
}
int Length(Node *q) {
return (q->rear - q->front + MaxSize) % MaxSize;
}
int QueueHead(Node *q) {
if (q->front==q->rear)
{
return -1;//判断队列是否为空
}
return q->elem[q->front];
}
void printfQueue(Node *q) {
int i = q->front;
while ((i+q->front)!=q->rear)
{
printf("%d ", q->elem[i]);
i = (i + 1) % MaxSize;//依次遍历
}
printf("\n");
}