数据结构--线性表--队列

一、队列简介
队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。队列中没有元素时,称为空队列。

队列的数据元素又称为队列元素。在队列中插入一个队列元素称为入队,从队列中删除一个队列元素称为出队。因为队列只允许在一端插入,在另一端删除,所以只有最早进入队列的元素才能最先从队列中删除,故队列又称为先进先出(FIFO—first in first out)线性表。
二、
对于队列的各种操作也没有像栈那么多,而且很多代码的重复性也很高,唯一不同的是队列的第二个结构体(可以先看上一篇关于栈的就晓得啦)里面的由一个栈顶元素,变成了两个:一个队首,一个队尾。
三、代码实现

#include<stdio.h>
#include<stdlib.h>
typedef struct data
{
    
    
	int nVaule;
	struct data *pNext;
}MyQueue;

typedef struct queue
{
    
    
	MyQueue *pTop;
	MyQueue *pTail;
	int nCount;
}Queue;

void q_Init(Queue **pQueue)
{
    
    
	*pQueue = (Queue*)malloc(sizeof(Queue));
	(*pQueue)->pTail = NULL;
	(*pQueue)->pTop = NULL;
	(*pQueue)->nCount = 0;
}

void q_Push(Queue *pQueue,int nNum)
{
    
    
	if(pQueue == NULL) exit(1);

	MyQueue *pTemp = NULL;
	pTemp = (MyQueue*)malloc(sizeof(MyQueue));
	pTemp->nVaule = nNum;
	pTemp->pNext = NULL;

	if(pQueue->pTop == NULL)
	{
    
    
		pQueue->pTop = pTemp;
	}
	else
	{
    
    
		pQueue->pTail ->pNext = pTemp;
	}
	pQueue->pTail = pTemp;
	pQueue->nCount++;
}

int q_Pop(Queue *pQueue)
{
    
    
	if(pQueue == NULL) exit(1);
	if(pQueue->nCount == 0) return -1;

	MyQueue *pDel = pQueue->pTop;
	int nNum = pDel->nVaule;

	pQueue->pTop=pQueue->pTop->pNext;
	free(pDel);
	pDel = NULL;
	pQueue->nCount--;

	if(pQueue->nCount == 0)
	{
    
    
		pQueue->pTail = NULL;
	}
	return nNum;
}

int q_IsEmpty(Queue *pQueue)
{
    
    
	if(pQueue == NULL) exit(1);

	return pQueue->nCount == 0 ? 1:0;
}

int main()
{
    
    
	Queue *pQueue = NULL;
	q_Init(&pQueue);

	q_Push(pQueue,1);
	q_Push(pQueue,2);
	q_Push(pQueue,3);
	q_Push(pQueue,4);

	printf("%d\n",q_Pop(pQueue));
	printf("%d\n",q_Pop(pQueue));
	printf("%d\n",q_Pop(pQueue));
	printf("%d\n",q_Pop(pQueue));

	return 0;
}

猜你喜欢

转载自blog.csdn.net/scarificed/article/details/112566623