队列的基本操作(数据结构)

队列的顺序实现

c 复制代码
#include <stdlib.h>
#include <iostream>
#include <stdio.h>

#define MaxSize 10//定义队列的长度

typedef struct{
	int front,rear;
	int data[MaxSize];
}SqQueue;

//初始化队列
void InitQueue(SqQueue &Q){
	Q.front=Q.rear=0;
} 

//判断队列是否为空
bool QueueEmpty(SqQueue Q){
	if(Q.front==Q.rear) return true;//空队列
	else return false; 
}

//入队
bool EnQueue(SqQueue &Q,int x){
	if((Q.rear+1)%MaxSize==Q.front){//判断队满
		return false; 
	}
	Q.data[Q.rear]=x;//新元素入队 
	Q.rear = (Q.rear+1)%MaxSize;//队尾指针加一取模 让队列循环使用 
	return true;
} 

//出队
int DeQueue(SqQueue &Q){
	if(Q.front==Q.rear) return false;//队列为空 
	int x;
	x = Q.data[Q.front];
	Q.front=(Q.front+1)%MaxSize;//对头指针后移 
	return x;
} 
 
//获取对头元素 
int GetHead(SqQueue &Q){
	if(Q.front==Q.rear) return false;
	int x;
	x = Q.data[Q.front];
	return x;
} 

//计算队列元素个数
int CountQueue(SqQueue &Q){
	if(Q.front==Q.rear) return false;
	int count;
	count = (Q.rear+MaxSize-Q.front)%MaxSize;
	return count;
}
 
//输出栈 
bool PrintSqQueue(SqQueue &Q){
	if(Q.front==Q.rear) return false;
	for(int i=Q.front;i<Q.rear;i++)
		printf("%d ",Q.data[i]);
	printf("\n");
	return true;
}

int main(){
	SqQueue Q;
	InitQueue(Q);
	printf("-----入队-----\n");
	EnQueue(Q,1);
	EnQueue(Q,2);
	EnQueue(Q,3);
	EnQueue(Q,4);
	EnQueue(Q,5);
	int count;
	count=CountQueue(Q);
	printf("队内元素个数为:%d\n",count);
	PrintSqQueue(Q);
	printf("-----出队-----\n");
	int x;
	x=DeQueue(Q);
	printf("%d出队\n",x);
	x=DeQueue(Q);
	printf("%d出队\n",x);
	x=DeQueue(Q);
	printf("%d出队\n",x);
	count=CountQueue(Q);
	printf("队内元素个数为:%d\n",count);
	PrintSqQueue(Q);
	return 0;
}

队列的链式实现

c 复制代码
#include <stdlib.h>
#include <iostream>
#include <stdio.h>

//链式队列结点 
typedef struct LinkNode{
	int data;
	struct LinkNode *next;
}LinkNode; 

//链式队列 
typedef struct{
	LinkNode *front,*rear;
}LinkQueue;

//队列初始化(带头结点) 
void InitQueue1(LinkQueue &Q){
	Q.front=Q.rear=(LinkNode*)malloc(sizeof(LinkNode));
	Q.front->next=NULL;
}

//队列初始化(不带头结点)
void InitQueue2(LinkQueue &Q){
	Q.front=NULL;
	Q.rear=NULL;
} 

//判断队列是否为空(带头结点)
bool IsEmpty1(LinkQueue Q){
	if(Q.front==Q.rear) return true;
	else return false; 
} 

//判断队列是否为空(不带头结点)
bool IsEmpty2(LinkQueue Q){
	if(Q.front==NULL) return true;
	else false;
} 

//入队(带头结点)
void EnQueue1(LinkQueue &Q,int x){
	LinkNode *s=(LinkNode *)malloc(sizeof(LinkNode));
	s->data=x;
	s->next=NULL;
	Q.rear->next=s;//新节点插入到rear之后 
	Q.rear=s;//修改表尾指针 
} 
 
//入队(不带头结点)
void EnQueue2(LinkQueue &Q,int x){
	LinkNode *s=(LinkNode *)malloc(sizeof(LinkNode));
	s->data=x;
	s->next=NULL;
	if(Q.front==NULL){//空队列中插入第一个元素 
		Q.front=s;//修改队头队尾指针 
		Q.rear=s;
	}
	else{//新节点插入到rear结点之后 
		Q.rear->next=s;
		Q.rear=s;
	}
}

//出队(带头结点) 
int DeQueue1(LinkQueue &Q){
	if(Q.front==Q.rear){//空 
		return false;
	}
	LinkNode *p=Q.front->next;
	int x;
	x=p->data;
	Q.front->next = p->next;
	if(Q.rear==p) Q.rear=Q.front;//最后一个结点出队,修改rear指针
	free(p);
	return x ;
} 

//出队(不带头结点)
int DeQueue2(LinkQueue &Q){
	if(Q.front==NULL) return false;//空 
	LinkNode *p=Q.front;
	int x;
	x=p->data; 
	Q.front=p->next;//修改front指针 
	if(Q.rear==p){//最后一个结点出队 
		Q.front=NULL;
		Q.rear=NULL;
	}
	free(p);
	return x; 
} 

//打印队列 (带头结点)
void PrintQueue1(LinkQueue &Q)
{
	LinkNode *temp=Q.front->next;
	printf("打印队列:");
	while(temp)
	{
		printf("%d ",temp->data);
		temp = temp->next;
	}
	printf("\n");
}

//打印队列 (不带头结点)
void PrintQueue2(LinkQueue &Q)
{
	LinkNode *temp=Q.front;
	printf("打印队列:");
	while(temp)
	{
		printf("%d ",temp->data);
		temp = temp->next;
	}
	printf("\n");
}

int main(){
	printf("--------带头结点-------\n");
	LinkQueue Q;
	InitQueue1(Q);
	printf("开始进队列\n");
	EnQueue1(Q,1);
	EnQueue1(Q,2);
	EnQueue1(Q,3);
	EnQueue1(Q,4);
	EnQueue1(Q,5);
	PrintQueue1(Q);//打印队列 
	if (!IsEmpty1(Q)) printf("非空队列\n");
	else printf("空队列\n");
	int x;
	x=DeQueue1(Q);
	printf("%d出队列\n",x);
	x=DeQueue1(Q);
	printf("%d出队列\n",x);
	x=DeQueue1(Q);
	printf("%d出队列\n",x);
	PrintQueue1(Q);//打印队列 
	
	printf("--------不带头结点-------\n");
	LinkQueue P;
	InitQueue2(P);
	printf("开始进队列\n");
	EnQueue2(P,1);
	EnQueue2(P,2);
	EnQueue2(P,3);
	EnQueue2(P,4);
	EnQueue2(P,5);
	PrintQueue2(P);//打印队列 
	if (!IsEmpty2(P)) printf("非空队列\n");
	else printf("空队列\n");
	int y;
	y=DeQueue2(P);
	printf("%d出队列\n",y);
	y=DeQueue2(P);
	printf("%d出队列\n",y);
	y=DeQueue2(P);
	printf("%d出队列\n",y);
	PrintQueue2(P);//打印队列 
	return 0;
}
相关推荐
不穿格子的程序员几秒前
数据结构篇1:不仅是存储:透视数据结构的底层逻辑与复杂度美学
数据结构·时间复杂度·空间复杂度
半桔1 分钟前
【设计模式】策略模式:可插拔算法,从硬编码到灵活适配,体会“算法解耦“思想
java·c++·算法·设计模式·策略模式
sali-tec6 分钟前
C# 基于OpenCv的视觉工作流-章18-图像缩放
图像处理·人工智能·opencv·算法·计算机视觉
好奇龙猫15 分钟前
【大学院-筆記試験練習:线性代数和数据结构(19)】
数据结构·线性代数
2401_8414956417 分钟前
【LeetCode刷题】LRU缓存
数据结构·python·算法·leetcode·缓存·lru缓存·查找
2401_8414956419 分钟前
【数据挖掘】Apriori算法
python·算法·数据挖掘·数据集·关联规则挖掘·关联规则·频繁项集挖掘
一路往蓝-Anbo30 分钟前
第 2 篇:单例模式 (Singleton) 与 懒汉式硬件初始化
开发语言·数据结构·stm32·单片机·嵌入式硬件·链表·单例模式
疯狂的喵32 分钟前
实时信号处理库
开发语言·c++·算法
小O的算法实验室33 分钟前
2023年ESWA SCI1区TOP,地面车辆与无人机协同系统的多区域覆盖双层路径规划,深度解析+性能实测
算法·论文复现·智能算法·智能算法改进
啵啵鱼爱吃小猫咪37 分钟前
机器人标准DH(SDH)与改进DH(MDH)
开发语言·人工智能·python·学习·算法·机器人