队列是一种特殊的数据结构。与“栈”大不相同的是,队列要求“先进先出”,即只有队尾可以插入,只有队首可以弹出。但其创建或操作的基本思路与“栈”大致相同,唯一不同的是链式队列拥有top和base两个指针。
由于思路大致相同,我在这篇文章中只写不同点和注意点。
(“栈”有关的知识请到这里学习:【数据结构】栈的链式实现和操作(创建栈,入栈,出栈,获取栈顶元素))
注意点:
①入队时:与栈不同的是,队列的入队时从队尾入,所以显然是尾插法。而先进后出的栈则是头插法。
②入队和出队时,均要考虑空队时的情况。
(1)入空队:此时top和base指针均指向NULL,当第一个元素入队时,我们只需要将top和base同时指向这个节点。而后续的入队,则是需要将base指针向后移位的。
(2)空队无法出队,需要返回错误信息。
*完整代码:
#ifndef _LWCQueue_H_
#define _LWCQueue_H_
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct Node Node;
typedef struct Queue Queue;
typedef int elemtype;
typedef struct Node* PNode;
typedef struct Queue* PQueue;
struct Node
{
elemtype data;
struct Node* next;
};
struct Queue
{
struct Node* top;
struct Node* base;
size_t size;
};
PNode Create_Node(elemtype x)
{
PNode L=(PNode)malloc(sizeof(Node));
L->data=x;
L->next=NULL;
return L;
}
PQueue Create_Queue()
{
PQueue L=(PQueue)malloc(sizeof(Queue));
L->top=L->base=NULL; //初始时top指针和base指针重合,都指向NULL
L->size=0;
return L;
}
/*队列:top-> xxx -> xxx -> xxx -> ......-> base -> NULL*/
void Push(elemtype x,PQueue L) //入队,指的是从队尾base指针处连接元素
{
PNode newnode=Create_Node(x);
if (L->size==0)
{
L->top=L->base=newnode;
L->size++;
}
else
{
L->base->next=newnode; //尾插法
L->base=newnode; //base指针后移
L->size++;
}
}
void Pop(PQueue L) //出队,指的是弹出top处的元素
{
if(L->size==0)
{
printf("NULL!Pop Error!\n");
exit(0);
}
else
{
PNode nextnode=L->top->next;
free(L->top);
L->top=nextnode;
L->size--;
}
}
elemtype Gettop(PQueue L) //获取top位置的元素
{
return (L->top->data);
}
elemtype Getbase(PQueue L)
{
return (L->base->data);
}
#endif