数据结构之队列

数据结构之队列

一、队列介绍

队列是一种特殊的线性表,他的特点是只能在头部进行读取,在尾部进行插入,也就是常说的“FIFO"结构,如下图所示:
图1 队列示意

二、队列功能

一个队列一般具有以下功能:

  1. 初始化队
  2. 入队
  3. 判断是否队空
  4. 出队
    实现队列的关键在于入队,入队的关键在于实现线性表的尾插法

三、实现代码

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、第三步是入队操作,入队操作主要涉及了尾插法:
尾插法的步骤如下:

  1. 新建一个节点;
  2. 遍历队列找到尾节点;
  3. 先将尾节点指向新节点,再将新节点指向NULL
    那么如何判断一个节点是尾节点呢?只要他指向NULL就代表他是尾节点
    接下来分情况来详细讨论:
    第一种情况是整个队列中只有头节点,那么遍历队列可知头节点即是尾节点:
    尾插法1
    第二种情况是整个队列有多个节点,那么示意如下:
    尾插法2
    代码如下:
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;
调试结果
以上就是本篇文章的所有内容,谢谢!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值