【数据结构(C语言版)系列三】 队列

队列的定义

队列是一种先进先出的线性表,它只允许在表的一端进行插入,而在另一端删除元素。这和我们日常生活中的排队是一致的,最早进入队列的元素最早离开。在队列中,允许插入的一端叫做队尾rear),允许删除的一段则称为队头front)。假设队列为q = (a1,a2,...an)则a1就是队头元素,an是队尾元素。

双端队列

除了栈和队列之外,还有一种限定性数据结构是双端队列:限定插入和删除操作在表的两端进行的线性表。两端分别称为端点1和端点2,也可像栈一样,可用一个铁道转轨网络来比喻双端队列。在实际使用中,还可以有输出首先的双端队列(即一个端点允许插入和删除,另一个端点只允许插入的双端队列)和输入首先的双端队列(即一个端点允许插入和删除,另一个端点只允许删除的双端队列)。而如果限定双端队列从某个端点插入的元素只能从该端点删除,则该双端队列就蜕变为两个栈底相邻接的栈了。

尽管双端队列看起来似乎比栈和队列更灵活,但实际上在应用程序中远不及栈和队列有用。

链队列——队列的链式表示和实现

和线性表类似,队列也有两种存储表示。

用链表表示的队列简称链队列。一个链队列需要两个分别指示队头和队尾的指针,分别称为头指针和尾指针才能唯一确定。为方便起见也给链队列添加一个头结点,并令头指针指向头结点。由此,空的链队列的判决条件为头指针和尾指针均指向头结点。如图所示

循环队列——队列的顺序表示和实现

在初始化建空队列时,约定front = rear = 0,每当插入新的队列尾元素时,尾指针增1,每当删除队列头元素时,头指针增1。因此,在非空队列中,头指针始终指向队列头元素,而尾指针始终指向队列尾元素的下一个位置,如图所示:

假设当前为队列分配的最大空间为6,则当队列处于d状态时,不可在继续插入新的队尾元素,否则将导致数组越界。然而此时又不宜如顺序栈那样,进行存储再分配扩大数组空间,因为队列的实际可用空间并为占满。因此提出了循环队列的概念。

如下图所示,队列头元素是J3,队列尾元素是J5,之后6、7、8插入,队列空间占满,有Q.front  = Q.rear,若3、4、5删除,队列空,同样有Q.front  = Q.rear。因此,只凭头指针=尾指针无法判断队列是空还是满,可有两种处理方法:其一是另设一个标志位以区别队列是空还是满;其二是少用一个元素空间,约定以队列头指针在队列尾指针的下一位置(即环状的下一位置)上作为队列满的标志。在C语言中,不能用动态分配的一维数组来实现循环队列,如果用户的应用程序中设有循环队列,则必须为它设定一个最大队列长度,若用户无法预估长度,则宜采用链队列。

附:3-9-模拟银行排队过程-栈和队列-第3章-《数据结构》课本源码-严蔚敏吴伟民版

 

转载于:https://www.cnblogs.com/wwf828/p/9543769.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C语言是一门非常流行的编程语言,也是很多数据结构和算法课程的教学语言之一。以下是一些基本数据结构C语言实现: 1. 数组 数组是一种基本的数据结构,它可以存储同一类型的一组数据。在C语言中,数组的定义形式如下: ``` type arrayName[arraySize]; ``` 例如,以下代码定义了一个包含10个整数的数组: ``` int numArray[10]; ``` 2. 链表 链表是一种常见的动态数据结构,它由一系列节点组成,每个节点都包含一个数据和一个指向下一个节点的指针。在C语言中,链表的定义通常使用结构体和指针来实现。 例如,以下代码定义了一个简单的链表节点结构体: ``` struct Node { int data; struct Node* next; }; ``` 3. 栈 栈是一种基于后进先出(LIFO)原则的数据结构。在C语言中,可以使用数组或者链表来实现栈。以下是一个基于数组实现的简单栈: ``` #define MAX_SIZE 100 int stack[MAX_SIZE]; int top = -1; void push(int data) { if (top >= MAX_SIZE-1) { printf("Stack Overflow\n"); return; } stack[++top] = data; } int pop() { if (top < 0) { printf("Stack Underflow\n"); return -1; } return stack[top--]; } ``` 4. 队列 队列是一种基于先进先出(FIFO)原则的数据结构。在C语言中,可以使用数组或者链表来实现队列。以下是一个基于数组实现的简单队列: ``` #define MAX_SIZE 100 int queue[MAX_SIZE]; int front = -1; int rear = -1; void enqueue(int data) { if (rear >= MAX_SIZE-1) { printf("Queue Overflow\n"); return; } if (front == -1 && rear == -1) { front = 0; } queue[++rear] = data; } int dequeue() { if (front == -1 || front > rear) { printf("Queue Underflow\n"); return -1; } return queue[front++]; } ``` 这些是一些常见的数据结构C语言中的实现方式。当然,这只是冰山一角,还有很多其他的数据结构和算法需要掌握。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值