队列的操作实现

队列,先进先出(FIFO)
          只允许在一端(队尾)进行插入操作(入队列),在另一端(对头)进行删除操作(出队列)
顺序队列操作实现:
        用单链表实现
#pragma once

#include<stdio.h>
#include<assert.h>
#include<windows.h>

typedef int QDataType;

typedef struct QNode{
	QDataType data;
	struct QNode *pNext;
}QNode;

typedef struct Queue{
	QNode *pFront;//队列头
	QNode *pRear;//队列尾
	int size;
}Queue;

//初始化
void QueueInit(Queue *pQ);

//入队
void QueuePush(Queue *pQ, QDataType data);

//出队
void QueuePop(Queue *pQ);

//返回队首元素
QDataType QueueFront(Queue *pQ);

//判断队列是否为空
int QueueIsEmpty(Queue *pQ);

//返回队列元素个数
int QueueSize(Queue *pQ);

//销毁
void QueueDestroy(Queue *pQ);
#include "Queue.h"

//初始化
void QueueInit(Queue *pQ)
{
	assert(pQ);
	pQ->pFront = pQ->pRear = NULL;
	pQ->size = 0;
}

//入队
void QueuePush(Queue *pQ, QDataType data)
{
	assert(pQ);
	pQ->size++;
	QNode *pNewNode = (QNode *)malloc(sizeof(QNode));
	assert(pNewNode);

	pNewNode->data = data;
	pNewNode->pNext = NULL;

	if (pQ->pRear == NULL){//空队列
		pQ->pFront = pQ->pRear = pNewNode;
		return;
	}
	
	//有元素队列
	pQ->pRear->pNext = pNewNode;
	pQ->pRear = pNewNode;
}

//出队
void QueuePop(Queue *pQ)
{
	assert(pQ);
	assert(pQ->size > 0);
	pQ->size--;

	//从对头出
	QNode *pOldFront = pQ->pFront;
	pQ->pFront = pQ->pFront->pNext;
	free(pOldFront);

	//只有一个元素的队列
	if (pQ->pFront == NULL){
		pQ->pRear = NULL;
	}
}

//返回队首元素
QDataType QueueFront(Queue *pQ)
{
	assert(pQ);
	assert(pQ->size > 0);

	return pQ->pFront->data;
}

//判断队列是否为空:1,空;0,不空
int QueueIsEmpty(Queue *pQ)
{
	return pQ->size == 0 ? 1 : 0;
}

//返回队列元素个数
int QueueSize(Queue *pQ)
{
	return pQ->size;
}

void QueueDestroy(Queue *pQ)
{
	assert(pQ);
	QNode *queuePre = NULL;
	while (pQ->pFront){
		queuePre = pQ->pFront;
		pQ->pFront = pQ->pFront->pNext;
		free(queuePre);
		queuePre = NULL;
	}
	pQ->pRear = NULL;
}

void Queueprint(Queue *pQ)
{
	assert(pQ);
	QNode *queue = pQ->pFront;
	while (queue){
		printf("%d->", queue->data);
		queue = queue->pNext;
	}
	printf("NULL\n");
}

int main()
{
	Queue queue;
	QueueInit(&queue);
	QueuePush(&queue, 1);
	QueuePush(&queue, 2);
	QueuePush(&queue, 3);
	QueuePush(&queue, 4);
	QueuePush(&queue, 5);
	QueuePush(&queue, 6);
	Queueprint(&queue);

	QueuePop(&queue);
	Queueprint(&queue);
	QueuePop(&queue);
	Queueprint(&queue);

	printf("%d\n",QueueFront(&queue));

	QueueDestroy(&queue);
	Queueprint(&queue);

	system("pause");
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值