1、队列简介:队列是一种特殊的线性表,它只允许在表的前端进行删除操作,而在表的后端进行插入操作,进行插入操作的端称为队尾,进行删除操作的端称为队头。队列中没有元素时,称为空队列。
2、队列的声名:和栈不同,我将链表中的每个元素添加上头指针与尾指针(还有一个计数器,判空时可以直接拿来用)将其变成一个队列。这样在入队与出队的操作就与链表大同小异了。
typedef struct quee
{
int val;
struct quee *pnext;
}myqueue;
typedef struct node
{
int ncount;
myqueue *phead;
myqueue *ptail;
}que;
3、初始化队列:
void q_init(que **pqueue)
{
*pqueue = (que*)malloc(sizeof(que));
(*pqueue)->ncount = 0;
(*pqueue)->phead = NULL;
(*pqueue)->ptail = NULL;
}
4、入队:
void q_push(que *pqueue,int n)
{
if(pqueue == NULL) return ;
myqueue *ptemp = NULL;
ptemp = (myqueue*)malloc(sizeof(myqueue));
ptemp->val = n;
ptemp->pnext = NULL;
if(pqueue->phead == NULL)
{
pqueue->phead = ptemp;
}
else
{
pqueue->ptail->pnext = ptemp;
}
pqueue->ptail = ptemp;
pqueue->ncount++;
}
5、出队:
void q_push(que *pqueue,int n)
{
if(pqueue == NULL) return ;
myqueue *ptemp = NULL;
ptemp = (myqueue*)malloc(sizeof(myqueue));
ptemp->val = n;
ptemp->pnext = NULL;
if(pqueue->phead == NULL)
{
pqueue->phead = ptemp;
}
else
{
pqueue->ptail->pnext = ptemp;
}
pqueue->ptail = ptemp;
pqueue->ncount++;
}
6、判空:
int isempty(que *pqueue)
{
if(pqueue == NULL) exit(1);
return pqueue->ncount == 0?1:0; //1为空,0为非空
}
测试:
int main()
{
que *qtmp = NULL;
q_init(&qtmp);
q_push(qtmp,1);
q_push(qtmp,3);
q_push(qtmp,4);
printf("该队列为:");
while(!isempty(qtmp))
{
printf("%d ",q_pop(qtmp));
}
printf("\n");
return 0;
}