循环顺序队列基本操作的具体实现算法

划重点:

        0.本文队列储存结构为int数组,长度为10,下标0-9.

        1.如何成为循环队列:

                元素入队,rear+1;元素出队,front+1;当rear=9,front>0时,数组的后方没有空间,但数组的前方还有空间,此时元素再入队,执行rear=(rear+1)%MAXqueue,rear=0,使用了数组前方的空间。

        2.本文判断队空队满方法:

                少用一个数据元素空间,即entry[front]不用,当队尾rear只差一步队头  (即 (rear+1)%MAXqueue==front)时认为队满。当front==rear时认为队空。

定义队列

#include<iostream>
#define MAXqueue 10 //后续会用到
#include<cstdlib>
using namespace std;

typedef enum Status { //后续会用到
	success, fail, fatal, range_error,overflow,underflow
}Status;

typedef struct queue{ //定义队列
	int front,rear; //指示队头和队尾位置
	int entry[MAXqueue]; //数据元素储存空间
}Queue,*QueuePtr; //定义为新的数据类型

初始化队列

Status Queue_Init(QueuePtr *q){ //q是二重指针,*q指向队列
	Status outcome = fatal;
	QueuePtr queueptr = (QueuePtr)malloc(sizeof(Queue));
	if(queueptr){
		queueptr->front=-1; 
		queueptr->rear=-1;
		*q = queueptr;
		outcome = success;
	}
	return outcome;
}

销毁队列

void Queue_Destory(QueuePtr *q){
	if(*q){ //*q存在即队列存在
		free(*q);
		*q = NULL;
	}
} 

清空队列

void Queue_Clear(QueuePtr q){
	q->front = q->rear = -1; 
} 
//数据元素存储空间长度为10,下标为0-9,置为-1即回到初始化状态,不需要清空数据存储空间entry[MAXqueue]

队列判空

bool Queue_Empty(QueuePtr q){
	return q->front==q->rear;
} 

队列判满

bool Queue_Full(QueuePtr q){
	return ((q->rear+1)%MAXqueue==q->front);
} 

入队

Status Queue_EnQueue(QueuePtr q,int item){
	Status outcome = overflow;
	if(!Queue_Full(q)){
		q->rear = (q->rear+1)%MAXqueue; //rear后移一位
		q->entry[q->rear]=item;
		outcome = success;
	}
	return outcome;
} 

出队

Status Queue_DeQueue(QueuePtr q,int *item){
	Status outcome = underflow;
	if(!Queue_Empty(q)){
		q->front = (q->front+1)%MAXqueue; //front后移一位
		*item = q->entry[q->front]; //将出队元素放入item中
		outcome = success;
	}
	return outcome; 
} 

求元素个数

int Queue_Size(QueuePtr q){
	return (q->rear-q->front)%MAXqueue;
} 

另:代码出自《数据结构与算法》(北京大学出版社)(主编:林劼,刘震,陈端兵,戴波)(代码稍有改动)

初来乍到,冒犯之处敬请海涵,欢迎大家多多指正。

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值