温故而知新->数据结构->循环队列->程序实现1_利用结构体

循环队列 ~ 程序实现一

本篇博客基于 温故而知新 -> 数据结构 -> 线性表 ->队列 博客中的理论知识,然后利用 C 中的 结构体 对数据结构中的 循环队列 进行代码实现!

其中涉及了循环队列的 (入队)(出队)(队头与队尾元素)改(没写(~ ̄▽ ̄)~),判空,打印等操作!并附带了实例以及对应的运行结果!

具体内容如下
(1)newCQueue.h

#ifndef __NEWCQUEUE_H_
#define __NEWCQUEUE_H_

#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>

typedef struct{
	//队头元素的位置
	int _front;
	//队尾元素的下一位置
	int _rear;
	//所存元素个数  最后一个元素的位置是k
	int _k;//元素计数时,是从0开始的
	//所存元素的首地址
	int *_data;
	//当前有效元素个数
	int _size;
}MyCircularQueue;

#endif

(2)main.c


#include"newCQueue.h"

MyCircularQueue* myCircularQueueCreate(int k)
{
	MyCircularQueue * cq = (MyCircularQueue*)malloc(sizeof(MyCircularQueue));
	cq->_data = (int *)malloc(sizeof(int) * k);// 数据空间为 k,因为有size确定个数
	cq->_k = k;
	cq->_front = cq->_rear = 0;//0~k皆可
	cq->_size = 0;
	return cq;
}

bool myCircularQueueIsFull(MyCircularQueue *obj)
{
	//方法一
	//rear +1 % 空间的长度 == front
	//return (obj->_rear + 1) % (obj->_k + 1) == obj->_front;

	//方法二
	return obj->_size == obj->_k;
}

bool myCircularQueueEnQueue(MyCircularQueue *obj, int value)
{
	//判断队列是否为满
	if (myCircularQueueIsFull(obj))
		return false;
	//队尾入队
	obj->_data[obj->_rear++] = value;
	//判断队尾是否越界 [0,k],越界则重置
	if (obj->_rear >= obj->_k)
		obj->_rear = 0;
	obj->_size++;
	return true;
}

bool myCircularQueueDeQueue(MyCircularQueue *obj)
{
	//队列为空,出队失败
	if (myCircularQueueIsFull(obj))
		return false;
	//队头出队
	obj->_front++;

	//判断队头是否越界
	if (obj->_front >= obj->_k)
		obj->_front = 0;
	obj->_size--;
	return true;
}

int myCircularQueueFront(MyCircularQueue *obj)
{
	//返回队头元素
	if (myCircularQueueIsFull(obj))
		return -1;
	return obj->_data[obj->_front];
}

int myCircularQueueRear(MyCircularQueue *obj)
{
	//返回队尾元素
	if (myCircularQueueIsFull(obj))
		return -1;
	if (obj->_rear != 0)
		return obj->_data[obj->_rear - 1];//元素个数是从0开始计数的
	else
		//rear 为0,队尾在数组的末尾
		return obj->_data[obj->_k - 1];
}

bool myCircularQueueIsEmpty(MyCircularQueue *obj)
{
	/*return obj->_front == obj->_rear;*/
	return obj->_size == 0;
}

void myCircularQueueFree(MyCircularQueue *obj)
{
	free(obj->_data);
	free(obj);
	printf("已销毁 \n");
}

void myCircularQueuePrint(MyCircularQueue *obj)
{
	int begin = obj->_front;
	int end = obj->_rear == 0 ? obj->_rear + obj->_k : obj->_rear;
	printf( "队列内容:");
	while (begin < end)
	{
		printf("%d ",obj->_data[begin]);
		begin++;
	}printf("\n");
}


void test()
{
	MyCircularQueue *cq = myCircularQueueCreate(5);
	myCircularQueueEnQueue(cq, 1);
	myCircularQueueEnQueue(cq, 2);
	myCircularQueueEnQueue(cq, 3);
	myCircularQueueEnQueue(cq, 4);
	myCircularQueuePrint(cq); // 1 2 3 4
	printf("\n");

	myCircularQueueDeQueue(cq);
	myCircularQueuePrint(cq); // 2 3 4
	myCircularQueueDeQueue(cq);
	myCircularQueuePrint(cq); // 3 4
	printf("\n");

	printf("此时队头元素为:%d \n", myCircularQueueFront(cq));
	printf("此时队尾元素为:%d \n", myCircularQueueRear(cq));
	printf("\n");

	myCircularQueueFree(cq);
}

int main()
{
	test();
	system("pause");
	return 0;
}

(3)运行结果
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值