一、队列简介
队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(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;
}