郝斌老师数据结构9(循环队列)

队列

定义:一种可以实现先进先出的存储结构

分类:

链式队列:链表实现

静态队列:数组实现,静态队列通常必须是循环队列,减少内存浪费。

链式队列:与链表类同,实现略

循环队列:

循环队列需要两个参数来确定:

       1.front(队头)

       2.rear(队尾)

循环队列的几个定义解释:

       1.队列初始化:front和rear均为0

       2.队列非空:front指向队列第一个元素下标,rear指向队列最后一个元素的下一个元素下标

       3.队列为空:front == rear,但是不一定为0

入队伪算法:

       1.将值存入r所代表的位置

       2.将r后移,正确写法:rear=(rear+1)%数组长度  错误写法:rear=rear+1

出队伪算法:

       front=(front+1)%数组长度

判断循环队列为空

       如果front与rear相等,则队列一定为空

判断队列为满

       (rear+1)%数组长度=front

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

#define Maxsize 6

typedef struct Queue {
	int* pBase;
	int front;
	int rear;
}QUEUE;

void init(QUEUE* q);
bool en_queue(QUEUE* q, int val);
bool is_full(QUEUE* q);
bool is_empty(QUEUE*);
void traverse(QUEUE*);
bool out_queue(QUEUE*, int*);

int main(void)
{
	int val;
	QUEUE Q;
	init(&Q);
	en_queue(&Q, 1);
	en_queue(&Q, 2);
	en_queue(&Q, 3);
	en_queue(&Q, 4);
	en_queue(&Q, 5);
	en_queue(&Q, 6);
	en_queue(&Q, 7);
	traverse(&Q);

	out_queue(&Q, &val);
	printf("出队元素:%d\n", val);
	out_queue(&Q, &val);
	printf("出队元素:%d\n", val);
	traverse(&Q);
	out_queue(&Q, &val);
	out_queue(&Q, &val);
	out_queue(&Q, &val);
	out_queue(&Q, &val);
	traverse(&Q);

	return 0;
}

void init(QUEUE* q)
{
	q->pBase = (int*)malloc((sizeof(int) * Maxsize));
	q->front = 0;
	q->rear = 0;
	return;
}
bool is_full(QUEUE* q)
{
	//这里设定队列中满时有一个元素不用,(rear+1)%size=front时队列满
	if ((q->rear + 1) % Maxsize == q->front)
		return true;
	else
		return false;
}

bool en_queue(QUEUE* q, int val)
{
	if (is_full(q))
	{
		printf("队列已满!入队失败\n");
		return false;
	}

	q->pBase[q->rear] = val;
	q->rear++;

	return true;
}

bool is_empty(QUEUE* q)
{
	if (q->rear == q->front)
		return true;
	else
		return false;
}

void traverse(QUEUE* q)
{
	if (is_empty(q))
	{
		printf("队列为空\n");
		return;
	}
	int i = 0;
	for (i = q->front; i != q->rear; i = (i+1)%Maxsize)
	{
		printf("%d ", q->pBase[i]);
	}
	printf("\n");
	return;
}

bool out_queue(QUEUE* q, int* val)
{
	if (is_empty(q))
	{
		printf("队列为空\n");
		return false;
	}

	*val = q->pBase[q->front];
	q->front++;
	return true;
}

 

展开阅读全文
©️2020 CSDN 皮肤主题: 大白 设计师: CSDN官方博客 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值