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;
}