数据结构学习笔录---队列的实现

本文详细介绍了队列的两种存储实现方式:顺序存储和链式存储。包括数据结构定义、操作函数接口及具体实现代码。

        队列是一种特殊的线性表,对队列的操作具有一定的约束,一般来说,队列只能允许在一端删除元素,在另一端插入元素,就比如食堂打饭排队,具有先来先服务的特征。队列的存储同样有两种方法,顺序存储和链式存储。

1、队列的顺序存储实现

(1)数据结构

typedef struct{
	int Data[MAXSIZE];
	int rear;
	int front;
}Queue;


(2)对队列操作函数

bool isEmptyQ(Queue *q);  --判断队列是否为空
bool isFullQ();     --判断队列是否满
Queue* createQueue();  --创建一个空队列
void AddQ(Queue* q,int elem);  --向队列里面增加元素
int DeleteQ(Queue* q);   --删除队列元素


(3)实现代码

bool isEmptyQ(Queue *q)
{
	if(q->front==q->rear)
		return true;
	else
		return false;
}
bool isFullQ(Queue *q)
{
	if((q->rear+1)%MAXSIZE==q->front)
		return true;
	else
		return false;
}
Queue* createQueue()
{
	Queue *q;
	q=(Queue*)malloc(sizeof(Queue));
	q->front=q->rear=0;
	return q;
}
void AddQ(Queue* q,int elem)
{
	if(isFullQ(q))
	{
		printf("the queue is full\n");
		return ;
	}
	else
	{
		q->rear=(q->rear+1)%MAXSIZE;
		q->Data[q->rear]=elem;
	}
}
int DeleteQ(Queue* q)
{
	if(isEmptyQ(q))
	{
		printf("the queue is empty\n");
	}
	else
	{
		q->front=(q->front+1)%MAXSIZE;
		return q->Data[q->front];	
	}
	return 0;
}
int main()
{
	Queue *q=createQueue();
	int i=0;
	for(i=0;i<MAXSIZE-1;i++)
	{	
		AddQ(q,i+10);
	}
	for(i=1;i<q->rear+1;i++)
		printf("%d ",q->Data[i]);
	 		
	int ret=DeleteQ(q);
	printf("\n出队列1次\n");
	printf("%d ",ret);
	ret=DeleteQ(q);
	printf("\n出队列2次\n");
	printf("%d ",ret);
	return 0;
}


2、队列链式存储实现

(1)数据结构

typedef struct Node{
	int data;
	struct Node* next; 
}QNode;

typedef struct{
	QNode* front;
	QNode* rear;
}Queue;

(2)对队列操作函数接口

bool isEmptyQ(Queue *q);  --判断队列是否为空
Queue* createQueue();  --创建一个空队列
void AddQ(Queue* q,int elem);  --向队列里面增加元素
int DeleteQ(Queue* q);   --删除队列元素

(3)代码实现

bool isEmptyQ(Queue *q)
{
	if(q->front==NULL && q->rear==NULL)
		return true;
	else
		return false;
}

void createQueue(Queue* q)
{
	q->front=NULL;
	q->rear=NULL;
}
void AddQ(Queue* q,int elem)
{
	QNode *Backcell;
	Backcell=(QNode*)malloc(sizeof(QNode));	
	Backcell->data=elem;
	Backcell->next=NULL;
	if(isEmptyQ(q))	
	{
		q->front=Backcell;
		q->rear=Backcell;
	}
	else
	{
		q->rear->next=Backcell;
		q->rear=Backcell;
	}
}
int DeleteQ(Queue* q)
{	
	int elem;
	QNode* Node;
	Node=q->front;
	elem=Node->data;
	if(isEmptyQ(q))
	{
		printf("the queue is empty\n");
	}
	else
	{
		q->front=Node->next;
		free(Node);
		return elem;
	}
	
}
//测试代码
int main()
{	
	Queue *q;
	int i;
	q=(Queue*)malloc(sizeof(Queue));
	createQueue(q);
	printf("入队顺序:\n");
	for(i=0;i<10;i++)
		AddQ(q,i);
	QNode *p=q->front;
	for(i=0;i<10;i++)
	{
		printf("%d ",p->data);
		p=p->next;	
	}
	printf("\n出队顺序\n");
	for(i=0;i<10;i++)
	{
		int ret=DeleteQ(q);
		printf("%d ",ret);
	}
	return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值