数据结构--队列

news/2024/9/21 11:04:59

文章目录

  • 队列
      • 队列存储结构特点
      • 队列的相关概念:
      • 队列的操作:
      • 队列的分类:
      • 数组实现
      • 链表实现

队列

队列存储结构特点

(1)队列中的数据元素遵循“先进先出”的原则
(2)在队尾添加元素,在队头删除元素。

队列的相关概念:

(1)队头与队尾: 允许元素插入的一端称为队尾,允许元素删除的一端称为队头;
(2)入队:队列的插入操作;
(3)出队:队列的删除操作。

队列的操作:

(1)入队: 通常命名为push()
(2)出队: 通常命名为pop()
(3)求队列中元素个数
(4)判断队列是否为空
(5)获取队首元素

队列的分类:

(1)基于数组的循环队列(循环队列)
(2)基于链表的队列(链队列)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

数组实现

#include <stdio.h>
#include <string.h>#define QUE_SIZE 10  //最大队列长度+1 ,实际长度为9typedef struct QueueInfo
{int front; //队头int tail;//队尾int queueArr[QUE_SIZE];}QUEUE;//判断队列是否为满int QueueIsFull(QUEUE *queue)
{if ((queue->tail+2)% QUE_SIZE == queue->front) //队列满的条件{printf("queue is full\n");return -1;}else //队列不为满return 0;}//判断队列是否为空int QueueIsEmpty(QUEUE *queue)
{if ((queue->tail + 1) % QUE_SIZE == queue->front) //为空的条件{printf("queue is empty\n");return -1;}elsereturn 0;
}//入队int QueueInsert(QUEUE *queue, int value)
{if (QueueIsFull(queue)) //如果尾部入队失败,即队列已满return -1;queue->tail = (queue->tail+1)%QUE_SIZE;//更新队尾元素queue->queueArr[queue->tail] = value; //插入新的队尾元素printf("insert %d  to %d\n",value,queue->tail);	return 0;
}//出队int QueueDelete(QUEUE * queue, int *value)
{if (QueueIsEmpty(queue))return -1;*value = queue->queueArr[queue->front];//删除头存放在value中printf("delete value from front %d  is %d\n",queue->front,*value);queue->front = (queue->front + 1)%QUE_SIZE;//更新头指针		return 0;
}int main(int argc, char const *argv[])
{int value = 0;int i = 0;int j = 0;QUEUE queue;memset(&queue,0,sizeof(queue));queue.front = 1;queue.tail = 0;//假设入队位12个数据,则只有前10个在队内,剩下3个入队失败for (i = 0; i < 12; i ++)QueueInsert(&queue,i);for (i = 0; i < 12; i++) //出队数据,最后3个出队失败QueueDelete(&queue,&i);return 0;
}

链表实现

#include <stdio.h>
#include <stdlib.h>
typedef struct Node
{int data;struct Node *next;
}Qnode;
typedef struct 
{Qnode *front;//指向链表头结点 Qnode *rear;//指向链表尾结点 
}Q;int deleteQ(Q *q)//删除结点并返回删除结点的值 
{Qnode *temp;int term;if(q->front == NULL){printf("队列空!\n");return 0;}temp = q->front;//保留头结点 if(q->front == q->rear)//若队列只有一个元素 q->front = q->rear = NULL;//将头结点尾结点都设为空 elseq->front = q->front->next;//否则改变头结点term = temp->data; free(temp);//释放头结点 return term;//返回头结点的值 
}void AddQ(Q *q,int num)//增添结点 
{Qnode *p = (Qnode *)malloc(sizeof(Qnode));p->data = num;Qnode *temp = q->rear;if(temp != NULL)//判断队列是否为空 {temp->next = p;q->rear = p;p->next = NULL;}else{q->front =  p;//若队列为空,将首尾均指向新增结点 q->rear = p;p->next = NULL;}
} 
int main()
{Q *q =(Q *) malloc(sizeof(Q));q->front = q->rear = NULL; for(int i = 0;i < 2;i++){AddQ(q,i);}for(int i = 0;i<2;i++){int n = deleteQ(q);printf("%d\t",n);}free(q);return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pgtn.cn/news/17634.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

文件服务器共享目录设置(二)

三、 设置磁盘配额及文件屏蔽 为了防止用户无限制的上传文件&#xff0c;或上传病毒木马等文件&#xff0c;还需要进一步加强安全设置。用磁盘配额来管理用户的文件夹空间&#xff0c;用文件屏蔽来阻止用户上传有风险的文件。 在win2003中&#xff0c;磁盘配额只能…

机器学习--局部加权线性回归

文章目录局部加权线性回归预测鲍鱼年龄局部加权线性回归 具体理论见上次笔记《线性回归》 预测鲍鱼年龄 import numpy as npclass LocalWeightedLinearRegression(object):def __init__(self,train_data,train_result):""":param train_data: 输入训练数据:p…

Standup Timer的MVC模式及项目结构分析

前言 学习android一段时间了&#xff0c;为了进一步了解android的应用是如何设计开发的&#xff0c;决定详细研究几个开源的android应用。从一些开源应用中吸收点东西&#xff0c;一边进行量的积累&#xff0c;一边探索android的学习研究方向。这里我首先选择了jwood的Standup …

JAVA IDEA切换新机器配置环境一览

1. 装jdk 自动配置环境变量 2. idea配置git git config --global user.name "xxx" git config --global user.email "xxxxx.com"3. idea配置maven 解压apache-maven-xxx.jar&#xff0c;配置环境变量MAVEN_HOME,PATH增加%MAVEN_HOME%\bin settings.xml…

数据结构--串

文章目录串串的基本概念串的基本操作代码实现串 串的基本概念 长度&#xff1a;串中字符的个数&#xff0c;称为串的长度。 空串&#xff1a;长度为零的字符串称为空串。 空格串&#xff1a;由一个或多个连续空格组成的串称为空格串。 串相等&#xff1a;两个串相等&#xff…

5,ORM组件XCode(动手)

本篇才真正是XCode教程第一篇。《速览》是为了以最简洁的语言最短小的篇幅去吸引开发者&#xff1b;《简介》则是对XCode组件和XCode开发模式的一个整体介绍&#xff0c;让开发者从宏观的角度去理解XCode&#xff1b;《共舞》把XCode提到了一个新的高度&#xff0c;让开发者感受…

使用Python,OpenCV追踪对象的轨迹,来确定其移动方向

这篇博客是上一篇博客: 使用Python,OpenCV转换颜色空间,追踪对象的轨迹的扩展。将使用Python,OpenCV追踪对象的轨迹,来确定其移动方向; 虽然球跟踪展示了目标检测和跟踪的基础知识,但无法计算球的实际移动方向。通过在两个单独的帧中简单地计算对象(x,y)坐标之间的增…

组合数容斥原理

文章目录组合数devu鲜花组合数 for(int i0;i<2000;i){for(int j0;j<i;j){if(!j) f[i][j]1;else f[i][j](f[i-1][j-1]f[i-1][j])%mod;}}快速幂 int quick_pow(int a, int k, int p) {int res 1;while (k){if (k & 1) res (LL)res * a % p;a (LL)a * a % p;k >&…