本人双非一本计算机系小白,几个月前从化学天坑跳到计算机,希望本系列能监督我练习敲数据结构的代码(在家真的效率好低QAQ),参考了《大话数据结构》和鄙校的数据结构教材(不敢恭维)。
目前为止我还没有在大学正式上过一节计算机专业课(除了c编基础公共必修),如果有大佬翻到本文并觉得我的代码写的是一坨,提前感谢您在评论区帮我指正!!!
昨天鸽了,所以今天双更补回来。
本次练习了循环队列的创建和出、入队
// 循环队列为了判断队列是否为空,有两种办法
// 法1 设置标志变量flag,当front == rear,且flag=0是队列为空,flag=1时队列为满
// 法2 当队列满时,保留一个元素空间(浪费一点内存),而front==rear时,队列为空
// 本示例采用法2
#include<stdio.h>
#define MAXSIZE 20
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
typedef int Status;
typedef int QElemType;
typedef struct
{
QElemType data[MAXSIZE];
int front; //头指针
int rear; //尾指针
}SqQueue;
//初始化一个队列
Status InitQueue(SqQueue *q) //传入一个队列q
{
q->front = 0;
q->rear = 0; //头尾指针均为0时,队列为空
return OK;
}
//求队列长度
Status QueueLength(SqQueue q) //传入一个队列q,返回队列长度
{
return (q.rear - q.front + MAXSIZE) % MAXSIZE;
// 重点理解,头指针可能在尾指针的前面,也有可能在尾指针的后面,+MAXSIZE可以防止尾减头的值一定为正值
}
//循环队列的入队
Status EnQueue (SqQueue *q, QElemType e) // 让元素e入队q
{
if(( q->rear+1 )%MAXSIZE == q->front ) //如果队尾的下一个就是队头,则返回ERROR
return ERROR;
q->data[q->rear]=e; //把e的值赋给q的队尾
q->rear = (q->rear+1)%MAXSIZE; // rear的指针后移一位,%MAXSIZE可以防止q此时处于队尾
return OK;
}
//循环队列的出队
Status DeQueue(SqQueue *q, QElemType *e) //删除q中的头元素,并返回头元素值保存到e中
{
if (q->front == q->rear)
return ERROR;
*e = q->data[q->front]; //先保存值到e中
q->front = (q->front+1)%MAXSIZE; //front指针后传一位
return OK;
}