【数据结构】队列的实现

队列:

队列是一种受限制的线性表,特殊之处在于它只允许在表的前端进行删除操作,只能在表的后端进行插入操作。我们称只允许删除的一端为队头,只进行插入的一端为队尾。
即队列是一种先进先出(First In First Out)的线性表,简称FIFO。

队列的顺序存储结构:是指分配一块连续的存储单元存放队列中的元素,并附设两个指针:队头指针 front指向队头元素,队尾指针 rear 指向队尾元素的下一个位置。

Queue.h
    #define _CRT_SECURE_NO_WARNINGS 1
    #include <stdlib.h>
    #include <stdio.h>
    #include <assert.h>
    
    typedef int QDataType;
    typedef struct QueueNode
    {
    	QDataType _data;    //当前结点存储数据
    	struct QueueNode* _next;   //指向下一个节点
    }QNode;
    
    typedef struct Queue
    {
    	QNode* _head;     //指向队列的头
    	QNode* _tail;     //指向队列的尾
    }Qu;
    
    void QueueInit(Qu*pq);   
    //队列的初始化:构造一个空队
    void QueueDestory(Qu* pq);    
    //队列的销毁:置空队列
    void QueuePrint(Qu* pq);      
    // 队列的打印:输出队列中数据
    QNode* BuyQueueNode(QDataType x);    
    //新建结点:单独结点
    void QueuePush(Qu* pq, QDataType x);    
    // 队尾插入(入队):对已存在的队列,插入一个元素到队尾,队发生变化
    void QueuePop(Qu* pq);               
    //队头删除(出队):对已存在队列,删除一个队首元素,队发生变化
    QDataType QueueFront(Qu* pq);        
    //取队头元素:读队首元素,并返回其值,队不变
    QDataType QueueBack(Qu*pq);        
    //取队头元素:读队尾元素,并返回其值,队不变
    int QueueEmpty(Qu* pq);         
    //判断队列是否为空:若为空队列则返回0,否则返回1
    int QueueSize(Qu* pq);        
    //计算队列的元素个数并返回此值,队不变
    
    void TestQueue();           
    //测试函数:测试上述函数功能
Queue.c
    #define _CRT_SECURE_NO_WARNINGS 1
    #include "Queue.h"
        
    void QueueInit(Qu* pq)
    {
    	QDataType x = 0;
    	assert(pq);
    	pq->_head = BuyQueueNode(x);    //定义一个头结点
    	pq->_tail = pq->_head;
    }
    
    void QueueDestory(Qu* pq)
    {
    	QNode* cur = pq->_head->_next;    //cur是当前队列的第一个结点
    	while (cur != NULL)              //释放所有结点
    	{
    		QNode* next = cur->_next;
    		free(cur);
    		cur = next;
    	}
    }
    
    QNode* BuyQueueNode(QDataType x)
    {
    	QNode* newNode = (QNode*)malloc(sizeof(QNode));
    	newNode->_data = x;
    	newNode->_next = NULL;
    	return newNode;
    }
    
    void QueuePush(Qu* pq, QDataType x)
    {
    	QNode* newnode = BuyQueueNode(x);
    	pq->_tail->_next = newnode;    //将新结点放在队尾
    	pq->_tail = newnode;
    }
    
    void QueuePop(Qu* pq)
    {
    	assert(pq);
    	QNode* 	cur = pq->_head->_next;
    	if (cur == NULL)       // 若队列中无元素
    	{
    		return;
    	}
    	if (cur == pq->_tail)     //若队列中只有一个元素
    	{
    		pq->_tail = pq->_head;
    	}
    	pq->_head->_next = cur->_next;
    	free(cur);
    }
    
    QDataType QueueFront(Qu* pq)
    {
    	QNode* 	cur = pq->_head->_next;
    	assert(pq);
    	return cur->_data;
    }
    
    QDataType QueueBack(Qu*pq)
    {
    	assert(pq);
    	return pq->_tail->_data;
    }
    
    int QueueEmpty(Qu* pq)
    {
    	QNode* 	cur = pq->_head->_next;
    	if (cur == NULL)
    		return 0;
    	else return 1;
    }
    
    int QueueSize(Qu* pq)
    {
    	int count = 0;
    	QNode* 	cur = pq->_head->_next;
    	if (cur == NULL)
    		return 0;
    	while (cur)
    	{
    		count++;
    		cur = cur->_next;
    	}
    	return count;
    }
    
    void QueuePrint(Qu* pq)
    {
    	QNode* 	cur = pq->_head->_next;
    	assert(pq);
    	while (cur != NULL)
    	{
    		printf("%d  ", cur->_data);
    		cur = cur->_next;
    	}
    	printf("\n");
    }
    
    void TestQueue()
    {
    	int i = 0;
    	Qu queue;
    	QueueInit(&queue);
    	printf("初始化队列完成 \n");
    	printf("尾插的结果是: ");
    	QueuePush(&queue, 1);
    	QueuePush(&queue, 2);
    	QueuePush(&queue, 3);
    	QueuePush(&queue, 4);
    	QueuePrint(&queue);
    	printf("头删的结果是: ");
    	QueuePop(&queue);
    	QueuePrint(&queue);
    	printf("队列的头结点是: %d \n", QueueFront(&queue));
    	printf("队列的尾结点是: %d \n", QueueBack(&queue));
    	i = QueueEmpty(&queue);
    	if (i == 0)  printf("队列为空!\n ");
    	else   printf("队列非空 \n ");
    	printf("队列的个数是: %d \n", QueueSize(&queue));
    	QueueDestory(&queue);
    	printf("销毁成功!\n");
    }
   
Test.c
    #define _CRT_SECURE_NO_WARNINGS 1
    #include "Queue.h"

    int main()
    {
    	printf("      *******队列的实现******\n");
    	TestQueue();
    	printf("\n");
    	printf("\n");
    	printf("\n");
    	system("pause");
    	return 0;
    }
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值