栈 入栈顺序1 出栈顺序N
队列 如队列顺序1 出队列顺序1
队列的作用是用来保持公平性
Queue.h
typedef int QDataType;
typedef struct QueueNode
{
struct QueueNode* next;
QDataType val;
}QNode;
typedef struct Queue
{
QNode* phead;
QNode* ptail;
int size;
}Queue;
//队尾插入
void QueuePush(QNode* pq,int x,QDataType x);
void QueuePop(QNode* pq,int x);
/*void QueuePush(QNode** pphead,QNode** pptail,int x,QDataType x);
void QueuePop(QNode** pphead,QNode** pptail,int x);
只要我们定义了Queue这样一个结构体,我们就不用再传入二级指针*/
Queue.c
#include"Queue.h"
void QueueInit(Queue* pq)
{
assert(pq);
pq->phead=NULL;
pq->ptail=NULL;
pq->size=0;
}
//队尾插入
void QueuePush(Queue* pq,QDataType x)
{
QNode* newnode=(QNode*)malloc(sizeof(QNode));
if(newnode==NULL)
{
perror("malloc fail");
return;
}
newnode->next=NULL;
newnode->val=x;
if(pq->ptail==NULL)
{
pq->phead=pq->ptail=newnode;
}
else
{
pq->ptail->next=newnode;
pq->ptail=newnode;
}
pq->size++;
}
}
void QueuePop(Queue* pq)
{
assert(pq);
assert(pq->size);
if(pq->phead->next==NULL)
{
free(pq->phead);
pq->phead=pq->ptail=NULL;
}
else
{
QNode* next=phead->next;
free(pq->phead);
pq->phead=next;
/*if(pq->phead==NULL)
{
pq->ptail==NULL;
}*/
pq->size--;
}
}
QDataType QueueFront(Queue* pq)
{
assert(pq);
assert(pq->phead);
return pq->phead->val;
}
QDataType QueueBack(Queue* pq)
{
assert(pq);
assert(pq->ptail);
return pq->ptail->val;
}
int QueueSize(Queue* pq)
{
assert(pq);
return pq->size;
}
bool QueueEmpty(Queue* pq)
{
assert(pq);
return pq->size==0;
}
void QueueDestory(Queue* pq)
{
assert(pq);
QNode*cur=pq->phead;
while(cur)
{
//保存下一个节点
QNode*next=cur->next;
free(cur);
cur=next;
}
pq->phead=pq->ptail=NULL;
pq->size=0;
}
空间大小是固定的
head==tail是空还是满呢 方法一:额外多开一个空间
方法二:增加一个size
满