静态队列

静态队列- --用数组实现
静态队列通常都必须是循环队列

循环队列的讲解:

1.静态队列为什么必须是循环队列?

数组表示的问题 

    对于队列最好的方法是使用链表实现,因为对于数组来说,队列可能会出现下面这种情况:

如图所示,不可以继续添加元素,否则会造成数组越界而遭致程序出错。然而此时又不应该扩充数组,因为还有大量实际空间未被占用。

此时我们应该如何解决这个问题呢?我们将其实现为循环队列

理解循环队列

    何谓循环队列?首先我们要说明的是循环队列仍然是基于数组实现的。但是为了形象化的说明问题,我们如下图所示

          

1.图中有两个指针(其实就是两个整数型变量,因为在这里有指示作用,所以这里理解为指针)front、rear,一个指示队头,一个指示队尾。

2.rear和front互相追赶着,这个追赶过程就是队列添加和删除的过程,如果rear追到head说明队列满了,如果front追到rear说明队列为空。

  说明:

    令队列空间中的一个单元闲置,使得队列非空时,Q.rear与Q.front之间至少间隔一个空闲单。

3.我们把它掰弯,用的是求余,这样两个值就不会跑出最大范围,并且可以实现弯曲的效果,所以说对于循环队列我们必须给定最大值MAXQSIZE。

这其实是我们臆想的,反正我们要做的就是利用循环来解决空间浪费的问题。

循环队列的实现过程

    ☆当添加一个元素时,(rear+1)%MAXQSIZE; //理解为什么求余?

    ☆当删除一个元素时,(front+1)%MAXQSIZE;//理解为什么求余?

    ☆当rear=front的时候,队列可能是满,也可能是空。

      因为存在满和空两种情况,我们需要分别判断:

        ☆:当队列添加元素到rear的下一个元素是head的时候,也就是转圈子要碰头了,我们就认为队列满了。(Q.rear+1)%MAXSIZE=Q.front

        ☆:当队列删除元素到head=rear的时候,我们认为队列空了。Q.rear==Q.front,不一定为0

  图示:

    

队列操作的一些说明

队列长度:Q.rear-Q.front;

队头元素:Q.base[Q.front];

队尾元素:Q.base[Q.rear-1];

 


2.循环队列需要几个参数来确定

需要2个参数来确定:
      front   ——指向队头
      rear    ——指向队尾


3.循环队列各个参数的含义

2个参数不同场合有不同的含义
    建议初学者先记住,然后慢慢体会
          1).队列初始化
                front和rear的值都是零
          2).队列非空
                front代表的是队列的第一个元素
                rear代表的是队列的最有一个有效元素的
          3) .队列空
                font和rear的值相等,但不一定是零

4.循环队列入队伪算法讲解

      链表队列入门介绍

      链表队列初始化

      链表队列入队算法

5.循环队列出队伪算法讲解

     链表队列出队算法

6.如何判断循环队列是否为空

如果front与rear的值相等,则该队列就一定为 空

7.如何判断循环队列是否已满

 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

链表队列入门介绍

1,快速开始: 队列是一种和栈相反的,遵循先进先出原则的线性表。此文章使用链表来实现队列。 如上图所示,就像一个自来水管,先进入水管的水先从水龙头出来,即Front位置的元素最先出队列,因为它们…

链表队列初始化

队列初始化 初始化主要是对为队列中的两个重要节点分配空间,这里我们需要注意的是初始化时头指针和尾指针指向同一个节点。 代码如下: status initQueue(LinkQueue* que) { //初始化队列que->headque->rear(QueuePtr)malloc(sizeof(QNode));if(…

链表队列入队算法

循环队列入队伪算法讲解 两步完成: 1.将值存入r所代表的位置 2.错误的写法rr1; 正确的写法是:r(r1)%数组的长度 入队操作 一定要搞清指针的概念。 首先rear和head指向同一个元素。然后,我们使rear的next指向新元素,这样rear指向的元素(即1&am…

链表队列出队算法

出队操作 我们来思考这个过程,在下图队列中,我们出队的第一个元素是元素A,不是1。(因为1不是插入进来了的,而是我们初始化时就有的)。我们首先让*t等于head的next,即元素A。然后修改head的next指…

数据库优化 - MYSQL优化

判断问题SQL 判断SQL是否有问题时可以通过两个表象进行判断: 系统级别表象 CPU消耗严重 IO等待严重 页面响应时间过长 应用的日志出现超时等错误 可以使用sar命令,top命令查看当前系统状态。 也可以通过Prometheus、Grafana等监控工具观察系统状态。&a…

队列入队和出队程序演示

#include <stdio.h> #include <string.h> #include <malloc.h>typedef struct Queue {int * pBase;int front;int rear;} QUEUE;void init(QUEUE *); bool en_queue(QUEUE *pQ, int val); //入队 void traverse_queue(QUEUE * pQ); bool full_queue(QUEUE…

图的遍历DFS与BFS(邻接表)

#include "stdafx.h" #include <iostream> #include <fstream> #include <queue> #include <Windows.h>using namespace std;#define INFINITY INT_MAX #define MAX_VERTEX_NUM 20 //顶点最多个数 #define LENGTH 5 //顶点字符长…

递归求n的阶层算法实现

专题:递归 定义:一个函数自己直接或间接调用自己 递归满足三个条件 1、递归必须得有-一个明确的中止条件 2、该函数所处理的数据规模必须在递减 3、这个转化必须是可解的 #include <stdio.h> #include <string.h> #include <malloc.h> #include <stdlib…

递归求1到100的和算法演示

循环和递归 递归:易于理解、速度慢、存储空间大 循环&#xff1a;不易理解、速度快、存储空间小 #include <stdio.h> #include <string.h> #include <malloc.h> #include <stdlib.h>long sum_sum(int n) {if (1 n) {return 1;}else {int sum n sum…

递归实现汉诺塔程序

[将汉诺塔]这不是线性递归&#xff0c;这是个非线性递归! n1 1 n2 3 n3 7 ................. n64 2的64次方减1 [这是个天文数字&#xff0c;就算世界上最快的计算机也解决不了 汉诺塔的复杂度是2的n次方减一 问题很复杂&#xff0c;恒真正解决问题的编码就…

解决scanf_s函数报错:没有为格式字符串传递足够的参数

报错&#xff1a;scanf_s函数报错:没有为格式字符串传递足够的参数 int main() {char s1[20] "i m name";char *p1, *p2;char s3[10] {0};p1 s1;p2 s3;printf("请输入你的名字: \n");scanf_s("%s",&s3);printf("%s\n", s3);f…

已知先序和中序求后序

先序: ABCDEFGH 中序: BDCEAFHG 求后序:DECBHGFA 具体看B站郝斌视频&#xff1a;https://www.bilibili.com/video/BV11s41167h6?p71

微软的Surface平板电脑RT版,RT是什么缩写?|转|

http://www.guokr.com/question/240887/ 1# 其实rt是win8家族的新成员&#xff0c;专为arm系列处理器设计的windows 8版本&#xff0c;不兼容win32程序 2# zzllrr 2012-06-21 09:28:19 找到权威解答了&#xff1a;“RT”代表“Runtime”的意思。既Windows Runtime Library&…

字符串移位包含

题目&#xff1a;给定两个字符串s1和s2&#xff0c;要求判定s2是否能够被s1做循环移位得到的字符串包含。例如&#xff0c;给定s1AABCD和s2CDAA,返回true;给定s1ABCD和s2ACBD,返回false。 答&#xff1a; #include "stdafx.h" #include <iostream>using namesp…

C++分文件的编写函数

不分文件编写函数&#xff1a; #include<iostream>using namespace std;//函数的声明 void swap(int a, int b); //函数的定义void swap(int a, int b) {int temp a;a b;b temp;cout << "a的值" << a << endl;cout << "b的值…

C++ 空指针和野指针

//1&#xff0c;指针变量指向内存中编号为0的空间为空指针 //2&#xff0c;空指针指向的内存空间是不可以访问的 #include<iostream> using namespace std; int main() {int a 10;int * p &a;cout << p << endl;cout << &a << e…

GL 与 CV 管线 (pipeline) 比较与相互转换

这里把二者作一个比较&#xff0c;并对相关的矩阵做一个联系以使能够相互转换。 1. CV中图像形成过程 (transformation stages) 这一过程可概括为四个坐标系的转换&#xff0c;分别为&#xff1a;世界坐标系、相机坐标系、图像坐标系、像素坐标系&#xff0c;如下图&#xff1a…

C++结构体作为函数参数传参

#include<iostream> using namespace std;#include<string>//结构体 struct Student {string name;int age;int score;}st3;/**结构体作为函数参数传参*/ //值传递 void printStufdent1(struct Student st3) {cout << "子函数" << endl;st3.…

C++结构体中const使用场景

看如下代码&#xff1a; #include<iostream> using namespace std;#include<string>//结构体 struct Student {string name;int age;int score;}st3;//值传递 void printStufdents(struct Student st2) {cout << "子函数" << endl;st2.age…

C++结构体案例

#include<iostream> using namespace std;#include<string>//学生结构体 struct Student {string name;int age;int score; };struct Teacher {string tName;struct Student sArray[5];};//定义一个给老师学生赋值的函数 void allocateSpace(struct Teacher tArray…