数据结构之队列
一、队列介绍
队列是一种特殊的线性表,他的特点是只能在头部进行读取,在尾部进行插入,也就是常说的“FIFO"结构,如下图所示:
二、队列功能
一个队列一般具有以下功能:
- 初始化队
- 入队
- 判断是否队空
- 出队
实现队列的关键在于入队,入队的关键在于实现线性表的尾插法
三、实现代码
1、首先需要声明一个结构体指针用以表示节点:
typedef struct Node{
int data;
struct Node* next;
}Node;
节点由两部分组成,data用来存储这个节点的数据而 next指针则指向了下一个节点的地址。
2、接下来需要初始化队列,实际上也就是声明头节点的内容
Node* initQueue(){
Node* Q = (Node*)malloc(sizeof(Node));
Q->data = 0;
Q->next = NULL;
}
头节点的数据域用以存储当前节点的个数,头节点的指针指向NULL。
3、第三步是入队操作,入队操作主要涉及了尾插法:
尾插法的步骤如下:
- 新建一个节点;
- 遍历队列找到尾节点;
- 先将尾节点指向新节点,再将新节点指向NULL
那么如何判断一个节点是尾节点呢?只要他指向NULL就代表他是尾节点
接下来分情况来详细讨论:
第一种情况是整个队列中只有头节点,那么遍历队列可知头节点即是尾节点:
第二种情况是整个队列有多个节点,那么示意如下:
代码如下:
void enQueue(Node* Q, int data){
Node* q = Q;
Node* node = (Node*)malloc(sizeof(Node));
node->data = data;
for(int i=0;i<Q->data;i++){
q = q->next
}
node->next = q->next;
q->next = node;
Q->data++;
}
4、判断是否队空,只有队不为空才可以进行出队的操作,而判断队不为空的条件就是判断头节点是否指向NULL
int isEmpty(Node* Q){
if(Q->data=0||Q->next = NULL){
return 1;
}
else{
return 0;
}
}
5、执行出队操作,首先判断是否队空,其次取首节点指向的节点的数据,并将首节点指向的地址指向当前节点指向的地址:
int deQueue(Node* Q){
if(isEmpty(Q)){
return -1;
}
else{
Node* node = Q->next;
int data = node->data;
Q->next = node->next;
free(node);
return data;
}
}
三、代码验证
验证思路:遍历当前队列并对队列进行出队操作
void printQueue(Node* Q){
Node* node = Q->next;
while(node){
printf("%d->",node->data);
node->node->next;
}
print("NULL\n");
}
主函数:
void main(void){
Node* Q = initQueue();
enQueue(Q,1);
enQueue(Q,2);
enQueue(Q,3);
enQueue(Q,4);
printQueue(Q);
//执行出队
int data = deQueue(Q);
data = deQueue(Q);
data = deQueue(Q);
data = deQueue(Q);
printf("The Top = %d\n",data);
printQueue(Q);
}
主函数将1,2,3,4分别入队,而后又执行了四次出队,预期结果应是所有节点均出队并且最后指向NULL;
以上就是本篇文章的所有内容,谢谢!