使用C语言实现队列

目录

1.队列

2.队列的相关操作

(1)数据结构定义

(2)初始化和重新申请空间

(3)判断队空,队满和获取队列中的元素个数

(4)入队,出队和获取队头元素

(5)主函数

(6)测试


1.队列

栈:只允许在一端进行入栈和出栈操作的线性表;

队列:允许在一端进行入队,另一端进行出队的线性表。

以下只是顺序队列的形式:

我们主要实现循环队列,因为循环队列的实现和顺序队列差不多,但是在判断队空和队满时需要注意。

 循环队列判断队空和队满有三种方法:

(1)方法一:上面给出的(本文主要使用这一种)。

(2)方法二:

 首先是另外设置一个标志位以区别队列是“空”还是“满”:比如:标志位 int tag=0(出队);tag(入队);

if(tag==1&&q.rear==q.front){
       printf("队满");
}

if(tag==0&&q.rear==q.front){
       printf("队空");
}

(3)方法二:

使用一个记录元素个数的变量:int size=0;

注:最早进入队列的元素最早出队。其实在操作系统中的作业排队。在允许多道程序运行的计算机系统中,同时有几个作业运行,如果运行的结果都需要通过通道输出,那么就要按请求输出的先后次序排队。每当通道传输完毕可以接收新的输出任务时,队头的作业先从队列中退出作业输出操作。比如还有我们在银行排队时也是队列的形式。 

2.队列的相关操作

(1)数据结构定义

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

#define MAXSIZE 5

typedef int ElemType;

typedef struct Qeueu{
	ElemType *data;
	int rear,front;
	int Maxsize;
}SqQueue;

(2)初始化和重新申请空间

//初始化 
void InitSqQueue(SqQueue&q){
	q.data=(ElemType*)malloc(MAXSIZE*sizeof(ElemType));
	if(q.data==NULL){
		printf("申请空间失败!\n");
		return;
	}
	q.front=0;
	q.rear=0;
	q.Maxsize=MAXSIZE;
}

//重新申请空间
void reMalloc(SqQueue&q,int len){
	ElemType*newbase=(ElemType*)realloc(q.data,(q.Maxsize+len)*sizeof(ElemType));
	q.data=newbase;
	q.Maxsize=q.Maxsize+len;
} 

void MenuSqQueue(){
	printf("--------------1.入队操作---------\n");
	printf("--------------2.出队操作---------\n");
	printf("--------------3.获取队头元素-----\n");
	printf("--------------4.重新初始化-------\n");
	printf("--------------5.退出操作---------\n");
}

(3)判断队空,队满和获取队列中的元素个数

//判断队空
bool Empty(SqQueue q){
	if(q.front==q.rear){
		return true;
	}else{
		return false;
	}
} 

//判断队满 
bool Full(SqQueue q){
	if((q.rear+1)%q.Maxsize==q.front){
		return true;
	}else{
		return false;
	}
} 

//队中元素
int QueueLength(SqQueue q){
	int size=(q.rear-q.front+q.Maxsize)%q.Maxsize;
	return size;
} 

(4)入队,出队和获取队头元素

//入队
void QueuePush(SqQueue&q,ElemType e){
	if(Full(q)){
		printf("队已满!\n");
		printf("请输入申请空间大小: ");
		int len=0;
		scanf("%d",&len);
		reMalloc(q,len);
		printf("当前空间大小: %d\n",q.Maxsize);
		return;
	}
	q.data[q.rear]=e;
	q.rear=(q.rear+1)%q.Maxsize;
	printf("插入元素成功!\n");
} 
//出队
void QueueDe(SqQueue&q,ElemType&e,int&mask){
	if(Empty(q)){
		printf("队已空!\n");
		mask=0;
		return;
	}
	e=q.data[q.front];
	q.front=(q.front+1)%q.Maxsize;
} 

//获取队头元素
void GetQueueHead(SqQueue q,ElemType&e,int&mask){
	if(Empty(q)){
		printf("队已空!\n");
		mask=0;
		return;
	}
	e=q.data[q.front];
} 

(5)主函数


int main(){
	SqQueue q;
	ElemType e;
	int flag=0;
	InitSqQueue(q);
	int mask=1;
	while(1){
		MenuSqQueue();
		printf("请输入操作: ");
		scanf("%d",&flag);
		switch(flag){
			case 1:
				printf("请输入元素(-1_end): ");
				scanf("%d",&e);
				while(e!=-1){
					QueuePush(q,e);
					printf("请输入元素(-1_end): ");
					scanf("%d",&e);
				}
				break;
			case 2:
				QueueDe(q,e,mask);
				if(mask!=0){
					printf("出栈元素 = %d\n",e);
				}
				break;
			case 3:
				GetQueueHead(q,e,mask);
				if(mask!=0){
					printf("获取元素 = %d\n",e);
				}
				break;
			case 4:
				InitSqQueue(q);
				printf("初始化成功!\n");
				break;
			default:
				free(q.data);
				printf("操作结束!\n"); 
		}
		if(flag==5){
			break;
		}
	}
	return 0;
} 

(6)测试

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值