循环队列的基本操作
程序员文章站
2022-06-06 22:16:54
...
队列的思维导图
循环队列的功能实现
//Queue.h
#pragma once
#include <stdio.h>
#include <assert.h>
#define _Maxsize 8
typedef int DataType;
typedef struct Queue
{
DataType _arr[_Maxsize]; //存放队列元素的数组
DataType _front; //队头元素下标
DataType _back; //队尾元素下标+1
DataType count; //共有多少元素
}Queue;
//队列初始化
void QueueInit(Queue* s);
//队列进元素
void QueuePush(Queue* s,DataType);
//对了出元素
void QueuePop(Queue* s);
//队列元素的个数
int QueueSize(Queue* s);
//队列是否为空
int QueueEmpty(Queue* s);
//队列队头元素
DataType Queuefront(Queue* s);
//队列队尾元素
DataType Queueback(Queue* s);
///////////////////////////////////////////////////////
//Queue.c
#define _CRT_SECURE_NO_WARNINGS 1
#include "Queue.h"
//初始化
void QueueInit(Queue* s)
{
assert(s);
s->_back = s->_front = 0;
s->count = 0;
}
//入队
void QueuePush(Queue* s,DataType data)
{
assert(s);
if(s->count == _Maxsize)
{
printf("队列数据已满,不能插入!!!\n");
return;
}
else
{
//s->_back %= _Maxsize; //当back为最大容量,则让它指向第一个位置
//这种方法不太好,因为没有达到最大容量时都需要模
//其实只需达到最大容量时模一下就行,而且模运算费时间
s->_arr[s->_back++] = data; //首次进来back为0,所以在加完后判断,前面也可以,不好理解
if(s->_back == _Maxsize)
s->_back = 0;
s->count++;
}
}
//出队
void QueuePop(Queue* s)
{
assert(s);
if(s->count == 0)
{
printf("队列的中的数据为空,不能出队列!!!\n");
return;
}
else
{
++(s->_front);
if(s->_front == _Maxsize)
s->_front = 0;
--(s->count);
}
}
int QueueSize(Queue* s)
{
assert(s);
return s->count;
}
int QueueEmpty(Queue* s)
{
assert(s);
return 0 == s->count;
}
DataType Queuefront(Queue* s)
{
assert(s);
if(s->count == 0)
{
printf("队列数据为空,无队头数据!!!\n");
return -1;
}
return s->_arr[s->_front];
}
//队尾元素
DataType Queueback(Queue* s)
{
assert(s);
if(s->count == 0)
{
printf("队列数据为空,无队尾数据!!!\n");
return -1;
}
//return s->_arr[(s->_back-1+_Maxsize)%_Maxsize];
if(0 != s->_back)
return s->_arr[s->_back-1]; //back指向队伍数据的下一的空间,back-1指向队尾元素
//这里只是取队尾元素,不需要改队尾的位置,所以减1,而不是自减
else
return s->_arr[_Maxsize-1];
}
///////////////////////////////////////////////////////
//test.c
#define _CRT_SECURE_NO_WARNINGS 1
#include "Queue.h"
void Queuetest();
int main()
{
Queuetest();
return 0;
}
void Queuetest()
{
Queue D;
QueueInit(&D);
QueuePush(&D,1); //给队列入8的元素
QueuePush(&D,2);
QueuePush(&D,3);
QueuePush(&D,4);
QueuePush(&D,5);
QueuePush(&D,6);
QueuePush(&D,7);
QueuePush(&D,8);
printf("QueueSize = %d\n",QueueSize(&D));
printf("Queuefront = %d\n",Queuefront(&D));
printf("Queueback = %d\n",Queueback(&D));
QueuePop(&D); //出队列
QueuePop(&D);
QueuePop(&D);
printf("QueueSize = %d\n",QueueSize(&D));
printf("Queuefront = %d\n",Queuefront(&D));
printf("Queueback = %d\n",Queueback(&D));
}
上一篇: 让风险远离 保护MySQL中的重要数据
下一篇: eclipse全屏插件