队列的定义及基本操作(初始化,销毁,清空,求长,判空,入队,出队)

队列的定义

队列(Queue)是仅在表尾进行插入操作,在表头进行删除操作的线性表。
是一种先进先出(FIFO)的线性表。
顺序队列可由一维数组来实现。

队列所剩余的空间问题(循环队列)

一般情况下,我们会认为当队尾等于MAXSIZE-1时,队列的空间已满。但是,由于我们会不断的进行出队操作,每进行出队操作时队头会向高位移动,此时低位的空间并没有被占用,队尾等于MAXSIZE-1时为假溢出。为了充分利用空间,我们可以将队列视为循环队列,每进行入队出队操作时,队头和队尾移动位置后对MAXSIZE进行模运算即可。

如队列最大长度MAXSIZE为5,队头front为3, 队尾rear为4,此时0,1,2,4位置并未被占用,我们若要将一个元素入队,则将元素放到位置4,然后进行 rear = (rear+1)%MXAXSZIE 操作,此时rear = 0,则下次进行入队操作时候即可从0位置进入。

判断队列为空和队列已满时的矛盾问题

由于我们将队列视为循环队列,则当队列为空时,队头front = 队尾rear;当队列已满时,仍是队头front = 队尾rear。为了解决此矛盾,我们可以弃用一个空间,如队列最大长度MAXSIZE为6,而我们只用5个空间,此时,队空时,队头front = 队尾rear;队满时,则队头front = 队尾rear+1。这样即可有效解决此矛盾。

结构体定义队列及队列元素的数据类型

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

#define MAXSIZE 66 //队列最大长度

typedef struct
{
	int data;
}Elemtype;

typedef struct
{
	Elemtype *elem;
	int front; //队头 
	int rear; //队尾 
}Queue;

基本操作函数

void initQueue(Queue* Q);//初始化,构造空队列
void destroyQueue(Queue* Q);//销毁队列
void clearQueue(Queue* Q);//清空队列
int Queuelength(Queue* Q);//队长
int isempty(Queue* Q);//判断队列是否为空
void enQueue(Queue* Q, Elemtype x);//入队
void deQueue(Queue* Q, Elemtype &x);//出队 

初始化

为队列元素分配内存空间,将队头和队尾设置为0,即可完成初始化,形成一个空队列。

void initQueue(Queue* Q)//初始化 
{
	Q->elem = (Elemtype*)malloc(sizeof(Elemtype)*MAXSIZE);
	if(Q->elem == NULL)
	{
		printf("初始化失败!!!\n");
	}
	Q->front = Q->rear = 0;
	printf("初始化成功!!!\n");
	return;
}

销毁队列

将所为队列元素分配的空间释放,即可销毁队列。

void destroyQueue(Queue* Q)//销毁队列 
{
	Q->front = Q->rear = 0;
	free(Q->elem);
	printf("已销毁!!!\n");
	return;
}

清空队列

将队头和队尾设置为0,即可视为空队列。

void clearQueue(Queue* Q)//清空队列 
{
	Q->front = Q->rear = 0;
}

队长

由于可能存在队头位于高位,队尾位于低位的情况,若直接将队尾与队头的差值对MAXSIZE进行模运算,所得的长度有误。为了避免这种错误,我们只需将队尾与队头的差值加上MAXSIZE,再对MAXSIZE进行模运算即可。

int Queuelength(Queue* Q)//求队长 
{
	return (Q->rear - Q->front + MAXSIZE)%MAXSIZE;
}

判断队列是否为空

上面有详细分析

int isempty(Queue* Q)//判断队列是否为空 
{
	if(Q->rear == Q->front)
	return 1;
	else
	return 0;
}

入队

入队前,需要先判断队列是否已满,若队列已满,则无法入队,若未满,则将入队元素放置队尾位置,再将队尾往后移动一个位置,即可完成入对操作。

void enQueue(Queue* Q, Elemtype x)//入队 
{
	if((Q->rear+1)%MAXSIZE == Q->front)
	{
		printf("队列已满!!!\n");
		return;
	}
	Q->elem[Q->rear] = x;
	Q->rear = (Q->rear+1)%MAXSIZE;
	printf("入队成功!!!\n");
	return;
}

出队

出队前,需要判断队列是否为空,若队列为空,则无法进行出队操作,若不为空,则接受队头位置元素,再将队头往后移动一个位置,即可完成出队操作。

void deQueue(Queue* Q, Elemtype &x)//出队 
{
	if(Q->rear == Q->front)
	{
		printf("队列为空!!!\n");
		return;
	}
	x = Q->elem[Q->front];
	Q->front = (Q->front+1)%MAXSIZE;
	printf("出队成功!!!\n");
	return;
} 

main函数

自行调用函数进行操作即可。

int main(void)
{
	Queue* Q = (Queue*)malloc(sizeof(Queue));
	Elemtype x, y;
	x.data = 666;
	initQueue(Q);
	enQueue(Q, x);
	deQueue(Q, y);
	printf("%d\n", y.data);
	//clearQueue(Q);
	//destroyQueue(Q);
	if(isempty(Q))
	printf("队列为空!!\n");
	else
	printf("队列不为空!!\n");
	int len = Queuelength(Q);
	printf("len = %d\n", len);
	return 0;
}
  • 26
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是链队列的基本运算实现,包括初始化销毁清空、判断是否为空队列、求队列的长度、取队列的头元素、入队出队: ```python class QueueNode: def __init__(self, data=None): self.data = data self.next = None class LinkedQueue: def __init__(self): self.front = QueueNode() self.rear = self.front def is_empty(self): return self.front == self.rear def get_length(self): length = 0 p = self.front.next while p: length += 1 p = p.next return length def get_head(self): if self.front == self.rear: return None return self.front.next.data def enqueue(self, data): node = QueueNode(data) self.rear.next = node self.rear = node def dequeue(self): if self.front == self.rear: return None p = self.front.next self.front.next = p.next if self.rear == p: self.rear = self.front return p.data def clear(self): self.front.next = None self.rear = self.front def destroy(self): self.front = None self.rear = None ``` 接下来是主程序,按照题目要求完成各个功能: ```python if __name__ == '__main__': # 初始化队列 q = LinkedQueue() print("初始化队列完成") # 判断链队列是否为空 if q.is_empty(): print("链队列为空") else: print("链队列不为空") # 依次入队元素a,b,c q.enqueue('a') q.enqueue('b') q.enqueue('c') print("元素a,b,c已入队") # 出队一个元素,并输出该元素 print("出队一个元素:", q.dequeue()) # 输出链队列的长度 print("链队列长度为:", q.get_length()) # 依次入队元素d,e,f q.enqueue('d') q.enqueue('e') q.enqueue('f') print("元素d,e,f已入队") # 输出链队列的长度 print("链队列长度为:", q.get_length()) # 出队所有元素,并输出出队序列 print("出队序列为:") while not q.is_empty(): print(q.dequeue()) # 销毁队列 q.destroy() print("销毁队列完成") ``` 运行结果如下: ``` 初始化队列完成 链队列为空 元素a,b,c已入队 出队一个元素: a 链队列长度为: 2 元素d,e,f已入队队列长度为: 5 出队序列为: b c d e f 销毁队列完成 ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值