栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

链队列、循环队列

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

链队列、循环队列

目录

一、链队列

1.1 定义链表

1.2 定义队列

1.3 创建一个队列

1.4 打印队列

 1.5 进队列

1.6 出队列

1.7 测试函数

1.8 完整代码及运行结果

二、循环队列

2.1  定义循环队列

2.2 初始化

2.3 进队列

2.4 出队列

2.5 输出队列

2.6 测试函数

2.7完整代码及运行结果


队列的操作与栈的操作相似,但与栈不同的是,队列遵循的是先进先出原则而非先进后出 ,而且队列的删除(即出队)是在队头进行而非队尾。

一、链队列

链队列的图示如下:

1.1 定义链表
 typedef struct LinkNode{
	int data;
	LinkNode *next;
}*LinkNodePtr;

1.2 定义队列
typedef struct LinkQueue{
	LinkNodePtr front;
	LinkNodePtr rear;
}*LinkQueuePtr;

1.3 创建一个队列
 LinkQueuePtr initQueue() {
	LinkQueuePtr resultPtr = (LinkQueuePtr)malloc(sizeof(LinkQueuePtr));
	
	LinkNodePtr headerPtr = (LinkNodePtr)malloc(sizeof(LinkNodePtr));
	headerPtr->next = NULL;
	
	resultPtr->front = headerPtr;
	resultPtr->rear = headerPtr;
	return resultPtr;
}// of initQueue

1.4 打印队列
 
 void outputQueue(LinkQueuePtr paraQueuePtr) {
 	LinkNodePtr tempPtr = paraQueuePtr->front->next;
 	while (tempPtr != NULL) {
 		printf("%d ", tempPtr->data);
 		tempPtr = tempPtr->next;
	 }// of while
	 printf("rn"); 
 }// of outputQueue.

 1.5 进队列
 void enqueue(LinkQueuePtr paraQueuePtr, int paraElement) {
 	// Step 1. Creat a new node.
 	LinkNodePtr tempNodePtr = (LinkNodePtr)malloc(sizeof(LinkNodePtr));
 	tempNodePtr->data = paraElement;
 	tempNodePtr->next = NULL;
 	
 	// Step 2. Link to the existing rear.
 	paraQueuePtr->rear->next = tempNodePtr;
 	paraQueuePtr->rear = tempNodePtr;
 }// of enqueue

1.6 出队列
 
  int dequeue(LinkQueuePtr paraQueuePtr) {
  	int resultValue;
  	LinkNodePtr tempNodePtr;
  	
  	//Step 1. Is the queue empty.
  	//判断是否为空 
	if (paraQueuePtr->front == paraQueuePtr->rear) {
		printf("The queue is empty.rn");
		return -1;
	}// of if
	
	//Step 2. Change the queue.
	tempNodePtr = paraQueuePtr->front->next;
	resultValue = tempNodePtr->data;
	paraQueuePtr->front->next = paraQueuePtr->front->next->next;
	
	if (paraQueuePtr->rear == tempNodePtr) {
		paraQueuePtr->rear = paraQueuePtr->front;
	}// of if
	
	//Step 3. Free space.
	free(tempNodePtr);
	tempNodePtr = NULL;
	
	//Step 4. Return.
	return resultValue;
  }// of dequeue

1.7 测试函数
 void testLinkQueue() {
 	LinkQueuePtr tempQueuePtr;
 	tempQueuePtr = initQueue();
 	
 	enqueue(tempQueuePtr, 10);
 	enqueue(tempQueuePtr, 30);
 	enqueue(tempQueuePtr, 50);
 	
 	outputQueue(tempQueuePtr);
 	
 	printf("Dequeue gets %drn", dequeue(tempQueuePtr));
 	printf("Dequeue gets %drn", dequeue(tempQueuePtr));
 	printf("Dequeue gets %drn", dequeue(tempQueuePtr));
 	printf("Dequeue gets %drn", dequeue(tempQueuePtr));
 	
 	enqueue(tempQueuePtr, 8);
 	outputQueue(tempQueuePtr);
 }// of testLinkQueue

1.8 完整代码及运行结果

完整代码:

#include
#include


 typedef struct LinkNode{
	int data;
	LinkNode *next;
}*LinkNodePtr;


typedef struct LinkQueue{
	LinkNodePtr front;
	LinkNodePtr rear;
}*LinkQueuePtr;


 LinkQueuePtr initQueue() {
	LinkQueuePtr resultPtr = (LinkQueuePtr)malloc(sizeof(LinkQueuePtr));
	
	LinkNodePtr headerPtr = (LinkNodePtr)malloc(sizeof(LinkNodePtr));
	headerPtr->next = NULL;
	
	resultPtr->front = headerPtr;
	resultPtr->rear = headerPtr;
	return resultPtr;
}// of initQueue

 
 void outputQueue(LinkQueuePtr paraQueuePtr) {
 	LinkNodePtr tempPtr = paraQueuePtr->front->next;
 	while (tempPtr != NULL) {
 		printf("%d ", tempPtr->data);
 		tempPtr = tempPtr->next;
	 }// of while
	 printf("rn"); 
 }// of outputQueue.
 

 void enqueue(LinkQueuePtr paraQueuePtr, int paraElement) {
 	// Step 1. Creat a new node.
 	LinkNodePtr tempNodePtr = (LinkNodePtr)malloc(sizeof(LinkNodePtr));
 	tempNodePtr->data = paraElement;
 	tempNodePtr->next = NULL;
 	
 	// Step 2. Link to the existing rear.
 	paraQueuePtr->rear->next = tempNodePtr;
 	paraQueuePtr->rear = tempNodePtr;
 }// of enqueue
 
 
  int dequeue(LinkQueuePtr paraQueuePtr) {
  	int resultValue;
  	LinkNodePtr tempNodePtr;
  	
  	//Step 1. Is the queue empty.
  	//判断是否为空 
	if (paraQueuePtr->front == paraQueuePtr->rear) {
		printf("The queue is empty.rn");
		return -1;
	}// of if
	
	//Step 2. Change the queue.
	tempNodePtr = paraQueuePtr->front->next;
	resultValue = tempNodePtr->data;
	paraQueuePtr->front->next = paraQueuePtr->front->next->next;
	
	if (paraQueuePtr->rear == tempNodePtr) {
		paraQueuePtr->rear = paraQueuePtr->front;
	}// of if
	
	//Step 3. Free space.
	free(tempNodePtr);
	tempNodePtr = NULL;
	
	//Step 4. Return.
	return resultValue;
  }// of dequeue


 void testLinkQueue() {
 	LinkQueuePtr tempQueuePtr;
 	tempQueuePtr = initQueue();
 	
 	enqueue(tempQueuePtr, 10);
 	enqueue(tempQueuePtr, 30);
 	enqueue(tempQueuePtr, 50);
 	
 	outputQueue(tempQueuePtr);
 	
 	printf("Dequeue gets %drn", dequeue(tempQueuePtr));
 	printf("Dequeue gets %drn", dequeue(tempQueuePtr));
 	printf("Dequeue gets %drn", dequeue(tempQueuePtr));
 	printf("Dequeue gets %drn", dequeue(tempQueuePtr));
 	
 	enqueue(tempQueuePtr, 8);
 	outputQueue(tempQueuePtr);
 }// of testLinkQueue
 
 
  int main() {
  	testLinkQueue();
  	return 1;
  }// of main

运行结果: 

10 30 50
Dequeue gets 10
Dequeue gets 30
Dequeue gets 50
The queue is empty.
Dequeue gets -1
8

二、循环队列

因受队尾入队,队头出队的限制,在入队和出队的操作中可能会出现“假溢出”的现象,实际上这时候的真实可用空间并未占满,为了解决这个问题,就有了下面的循环队列。

“假溢出”图示:

循环队列图示:

 

2.1  定义循环队列
 typedef struct CircleIntQueue {
 	int data[TOTAL_SPACE];
 	
 	int head;
 	
 	int tail;
 }*CircleIntQueuePtr;

2.2 初始化
 CircleIntQueuePtr initQueue() {
 	CircleIntQueuePtr resultPtr = (CircleIntQueuePtr)malloc(sizeof(struct CircleIntQueue));
	resultPtr->head = 0;
	resultPtr->tail = 0;
	
	return resultPtr;
 }// of initQueue

2.3 进队列
 CircleIntQueuePtr initQueue() {
 	CircleIntQueuePtr resultPtr = (CircleIntQueuePtr)malloc(sizeof(struct CircleIntQueue));
	resultPtr->head = 0;
	resultPtr->tail = 0;
	
	return resultPtr;
 }// of initQueue

2.4 出队列
 
 int dequeue(CircleIntQueuePtr paraPtr) {
 	int resultValue;
 	if (paraPtr->head == paraPtr->tail) {
 		printf("No element in the queue.rn");
 		return -1;
	 }// of if
	 
	 resultValue = paraPtr->data[paraPtr->head % TOTAL_SPACE];
	 paraPtr->head ++;
	 
	 return resultValue;
 }// of dequeue

2.5 输出队列
 void outputLinkQueue(CircleIntQueuePtr paraPtr) {
 	int i;
 	if (paraPtr->head == paraPtr->tail) {
 		printf("Empty queue.");
 		return;
	 }// of if 
	 
	 printf("Elements in the queue: ");
	 for (i = paraPtr->head; i < paraPtr->tail; i ++) {
	 	printf("%d ", paraPtr->data[i % TOTAL_SPACE]);
	 }// of for i
	 
	 printf("rn");
 }// of outputLinkQueue
 

2.6 测试函数
 void testLinkQueue() {
 	int i = 10;
 	CircleIntQueuePtr tempPtr = initQueue();
 	for (; i < 16; i ++) {
 		enqueue(tempPtr, i);
	 }// of for i
	 
	 outputLinkQueue(tempPtr);
	 
	 for(i = 0; i <6; i ++) {
	 	printf("dequeue gets %drn", dequeue(tempPtr));
	 }//of for i
	 
	 enqueue(tempPtr, 8);
	 outputLinkQueue(tempPtr);
 }// of testLinkQueue

2.7完整代码及运行结果

完整代码: 

#include
#include

#define TOTAL_SPACE 5


 typedef struct CircleIntQueue {
 	int data[TOTAL_SPACE];
 	
 	int head;
 	
 	int tail;
 }*CircleIntQueuePtr;
 

 CircleIntQueuePtr initQueue() {
 	CircleIntQueuePtr resultPtr = (CircleIntQueuePtr)malloc(sizeof(struct CircleIntQueue));
	resultPtr->head = 0;
	resultPtr->tail = 0;
	
	return resultPtr;
 }// of initQueue
 
 //进队 
 void enqueue(CircleIntQueuePtr paraPtr, int paraValue) {
 	if ((paraPtr->tail + 1) % TOTAL_SPACE == paraPtr->head) {
 		printf("Queue full.rn");
 		return;
	 }// of if 
	 
	 paraPtr->data[paraPtr->tail % TOTAL_SPACE] = paraValue;
	 paraPtr->tail ++;
 }// of enqueue
 
 
 int dequeue(CircleIntQueuePtr paraPtr) {
 	int resultValue;
 	if (paraPtr->head == paraPtr->tail) {
 		printf("No element in the queue.rn");
 		return -1;
	 }// of if
	 
	 resultValue = paraPtr->data[paraPtr->head % TOTAL_SPACE];
	 paraPtr->head ++;
	 
	 return resultValue;
 }// of dequeue
 

 void outputLinkQueue(CircleIntQueuePtr paraPtr) {
 	int i;
 	if (paraPtr->head == paraPtr->tail) {
 		printf("Empty queue.");
 		return;
	 }// of if 
	 
	 printf("Elements in the queue: ");
	 for (i = paraPtr->head; i < paraPtr->tail; i ++) {
	 	printf("%d ", paraPtr->data[i % TOTAL_SPACE]);
	 }// of for i
	 
	 printf("rn");
 }// of outputLinkQueue
 
 
 void testLinkQueue() {
 	int i = 10;
 	CircleIntQueuePtr tempPtr = initQueue();
 	for (; i < 16; i ++) {
 		enqueue(tempPtr, i);
	 }// of for i
	 
	 outputLinkQueue(tempPtr);
	 
	 for(i = 0; i <6; i ++) {
	 	printf("dequeue gets %drn", dequeue(tempPtr));
	 }//of for i
	 
	 enqueue(tempPtr, 8);
	 outputLinkQueue(tempPtr);
 }// of testLinkQueue
 

 int main() {
 	testLinkQueue();
 	return 1;
 }// of main
 

运行结果:

Queue full.
Queue full.
Elements in the queue: 10 11 12 13
dequeue gets 10
dequeue gets 11
dequeue gets 12
dequeue gets 13
No element in the queue.
dequeue gets -1
No element in the queue.
dequeue gets -1
Elements in the queue: 8

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/892444.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号