最简单的队列

一。什么是队列:

队列(Queue)是一种只允许在一端插入数据(入队),而另一端删除数据(出队)的线性表。
插入数据的端口叫队头(head),另一端叫队尾(rear),
特点:先进先出(你去排队买东西,先排队的人肯定先买,后排队的人后买)

二。(顺序存储结构)队列的基本操作

  1. 队列初始化InitQueue(Q),构造一个空队列Q
  2. 判断一个队列是否为空QueueEmpty(Q),队列Q为空返回1
  3. 销毁队列DestroyQueue(&Q),释放队列所占的存储空间
  4. 入队EnQueue(Q,x),将元素x插入队列Q
  5. 出队DeQueue(Q),删去Q的队头元素并且将它的元素值返回
  6. 读取队头元素GetHead(Q),返回Q的队头元素,不改变队列Q的状态
  7. 判断队列是否已满QueueFull(Q),诺队列Q为满,则返回1

三。具体的代码及其分析:

	#include<stdio.h>
	#include<stdlib.h>
	#define MaxSize 21//给队列一个最大长度21 
	typedef int QueueElemType;//队列元素的类型设定为整型 
	 
	typedef struct{
		QueueElemType *base;//base指向队列存储区的首地址 
		int front;//队头指针,指向队头元素 
		int rear;//队尾指针,指向队尾元素 
	}SeqQueue; //循环队列 
	//1队列的初始化--------------------------------- 
	SeqQueue InitQueue(){
		SeqQueue Q;//实例化一个Q队列 
		Q.base = (QueueElemType *)malloc(MaxSize * sizeof(QueueElemType));//给队列申请MaxSize个存储空间 
		if(!Q.base){//如果Q.base存在则Q.base的值等于true,存储空间分配成功, 
			printf("申请存储空间失败");
			exit(0); 
		}
		Q.front=0;//队列置空 
		Q.rear=0;
		return Q;
		
	} 
	//2判断队列是否为空-------------------------------- 
	int QueueEmpty(SeqQueue Q){
		return (Q.front==Q.rear)? 1: 0;//如果Q.front==Q.rear则队列为空返回1,否则返回0 
	} 
	//3判断队满------------------------------------------- 
	int QueueFull(SeqQueue Q){
		return (Q.front==(Q.rear+1)%MaxSize)? 1: 0;//如果Q.front==(Q.rear+1)%MaxSize则循环队列为满返回1,否则返回0 
	} 
	//4入队------------------------------------------------- 
	SeqQueue EnQueue(SeqQueue Q,QueueElemType x){
		if(QueueFull(Q)){
			printf("队满,入队失败");
	//        exit(0); 
		}
		else{
			*(Q.base+Q.rear) = x;//插入元素存入队尾 
			Q.rear=(Q.rear+1)%MaxSize;//队尾指针加一,入队完成 
			//为什么写Q.rear=(Q.rear+1)%MaxSize而不是Q.rear=Q.rear+1
			//Q.rear=(Q.rear+1)%MaxSize可以将Q.rear的值限定在0~MaxSize中 
		}
		return Q;
	} 
	//5出队----------------------------------------------- 
	SeqQueue DeQueue(SeqQueue Q,QueueElemType *e){
		if(Q.front==Q.rear){
			printf("队空,出队失败");
	        exit(0); 
		}
		else{
			*e = *(Q.base+Q.front);//取出队头元素,由实参e带回 
			Q.front=(Q.front+1)%MaxSize;//令Q.front+1在0~MaxSize中,出队完成 
		}
		return Q;
	} 
	//6读取队头元素------------------------------------------ 
	 QueueElemType GetHead(SeqQueue Q){
	 	if(QueueEmpty(Q)){
	 		printf("\n队列为空,读取队头失败");
			 exit(0); 
		 }
		 else{
		 	return *(Q.base+Q.front);
		 	//这里为什么返回的是*(Q.base+Q.front)而不是*Q.front
		    //因为这里有*  所以是对地址的操作,Q.base是这个队列的首地址,Q.front是相对于首地址的偏移量
			//比如是Q.base的地址为5,Q.front等于5,则Q.front的真正地址为Q.base+偏移量5==10 
		 }
	 } 
	 //7销毁队列---------------------------------------------- 
	 void DestroyQueue(SeqQueue Q){
	 	free(Q.base);//free()为#include<stdio.h>中的一个库函数,可以释放存储空间 
	 	printf("\n队列已经销毁,空间释放完成");
		 return ; 
	 } 
	 //8遍历输出队列中的各个元素------------------------------- 
	 void QueueDisplay(SeqQueue Q){
	 	int i;
	 	if(QueueEmpty(Q)){
	 		printf("队列为空!无元素输出"); 
		 }
		else{
			printf("\n遍历队列元素--------------------\n");
			for(i=Q.front;Q.rear!=i%MaxSize;i=(i+1)%MaxSize)
			printf("\n%3d",*(Q.base+i));
		}
		return ;
	 } 
	 int main(){
	 	int i;
	 	QueueElemType m,t,temp;//定义一个QueueElemType类型的临时变量temp,以便出队时存放出队元素的值 
	 	printf("\n\ntemp的默认值=%d\n",temp);
	 	printf("\n\nt的默认值=%d\n",t);
	 	printf("\n\nm的默认值=%d\n",m);
	 	printf("这t,m和temp的默认值都不相等,你发现了什么?\n");
	 	SeqQueue queue;
	 	queue=InitQueue();
	 	printf("入队开始:-----------------------\n");
	 	for(i=1;i<21;i++){
	 		queue=EnQueue(queue,i*i);
	 		printf("\n%d入队完成",i*i); 
		 }
		printf("\n入队结束!----------------------\n");
		QueueDisplay(queue);
		printf("\n执行出队!----------------------\n");
		for(i=1;i<5;i++){
			queue=DeQueue(queue,&temp);
			printf("\n\n%d出队完成",temp);
		}
		QueueDisplay(queue);
		printf("\n\n读取当前的队头元素=%d\n",GetHead(queue));
		
		QueueDisplay(queue);
		DestroyQueue(queue);
		return 0;
	 }

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
队列是一种数据结构,它遵循先进先出(FIFO)的原则。这意味着新添加到队列中的元素总是被放在队列的末尾,而从队列中移除的元素总是最早进入队列的元素。 在C语言中,可以使用数组和指针来实现队列。以下是一个简单队列实现示例: ```c #include <stdio.h> #include <stdlib.h> #define MAX_SIZE 10 typedef struct { int data[MAX_SIZE]; int front; int rear; } Queue; void initQueue(Queue *q) { q->front = -1; q->rear = -1; } int isQueueEmpty(Queue *q) { return (q->front == -1 && q->rear == -1); } int isQueueFull(Queue *q) { return (q->rear == MAX_SIZE - 1); } void enqueue(Queue *q, int value) { if (isQueueFull(q)) { printf("Queue is full\n"); return; } if (q->front == -1) { q->front = 0; } q->rear++; q->data[q->rear] = value; } int dequeue(Queue *q) { if (isQueueEmpty(q)) { printf("Queue is empty\n"); return -1; } int value = q->data[q->front]; q->front++; return value; } void printQueue(Queue *q) { if (isQueueEmpty(q)) { printf("Queue is empty\n"); return; } printf("Queue elements: "); for (int i = q->front; i < q->rear + 1; i++) { printf("%d ", q->data[i]); } printf("\n"); } ``` 这个队列的实现包括以下功能: * `initQueue`:初始化队列,设置队首和队尾为-1表示队列为空。 * `isQueueEmpty`:检查队列是否为空。如果队首和队尾都为-1,则队列为空。 * `isQueueFull`:检查队列是否已满。如果队尾的下一个位置等于数组的最大索引减1,则队列已满。 * `enqueue`:将元素添加到队列的末尾。如果队列已满,则打印错误消息并返回。否则,将新元素添加到队尾,并更新队尾的位置。 * `dequeue`:从队列的开头移除一个元素并返回它。如果队列为空,则打印错误消息并返回-1。否则,返回并删除队首的元素,并更新队首的位置。 * `printQueue`:打印队列中的所有元素。如果队列为空,则打印错误消息并返回。否则,遍历队列并打印每个元素。 这个简单队列实现可以用于各种应用,例如模拟程序中的任务调度、实现先进先出算法等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值