顺序队列和链队列

news/2024/12/2 18:01:43/

队列也是一种线性结构,不同于栈的是队列为先进先出的数据结构,遵循一边入队一边出队。

在这里插入图片描述

顺序队列的底层使用的是数组,因此需预先申请一块足够大的内存空间初始化顺序队列。除此之外,为了满足顺序队列中数据从队尾进,队头出且先进先出的要求,我们还需要定义两个指针(top 和 rear)分别用于指向顺序队列中的队头元素和队尾元素。

数组中一直存储着入栈数据,只是读数据的时候从记录的队首元素读取。

在这里插入图片描述
在添加(入队)时,元素被添加到队位(rear)所在位置,对位加一,依次类推,这样在添加元素时元素依次填充数组的位置。

#include<stdio.h>
#define MAXSIZE 5
typedef struct Queue{int datas[MAXSIZE];int front;int rear;
}SqQueue;//入队
int Push(SqQueue *S,int e){if(S->rear == MAXSIZE) return 0;S->datas[S->rear] = e;S->rear++;return 1;
}//出队
int Pop(SqQueue *S){int e = S->datas[S->front];S->front++;return e;
}int main(){SqQueue S;S.front = S.rear =0;Push(&S,3);Push(&S,5);Push(&S,7);int e = Pop(&S);printf("%d\n",e);int e1 = Pop(&S);printf("%d\n",e1);int e2 = Pop(&S);printf("%d\n",e2);return 0;
}

在删除(出队)是,队头(top)指向的元素赋值个给临时变量,队头后移指向下一个元素。队头像游标一样持续记录当前位置,模拟元素的出队。

对于数组实现的会遇到假溢出问题,如下:
在这里插入图片描述
当rear指向最后一个元素时,rear无法在后移,于是队列满了,但是看top的位置却在第4个元素的位置,也是说前三个元素都出栈了,空出了三个元素的位置。为了解决该假溢出的问题,可以将队列变成一个循环队列

循环队列利用top,rear,MAXSIZE的关系巧妙模拟循环。rear在指向最后一个位置时再次添加就回到数组第一个位置,再一次向后移,top也是如此。

若是循环队列,则必是以MAXSIZE为进制的运算。所以rear只能在[1,MAXSIZE]的区间内。那么rear的运算就变成了:

S->rear = (S->rear+1)%MAXSIZE

注意如果以mAXSIZE定义数组那么数组为[MAXSIZE-1],因为数组是从0开始的。

如何判断队列是否满了呢?

  • 第一种情况

在这里插入图片描述

在这里插入图片描述

主要有以上两种情况表示队列满了。第一种S->rear = (S->rear+1)%MAXSIZE,注意是计算后的情况,满足Q.front = Q.rear。这种判断是不合理的,因为该判断条件也是判空的条件。

一般情况下可以少用一个元素空间, 即队列空间大小为m时,有m-1个元素就认为是队满。这样判断队空的条件不变, 即当头、 尾指针的值相同时, 则认为队空;而当尾指针在循环意义上加1后是等千头指针, 则认为队满。(在舍弃一个存储元素的空间情况下完美解决问题)。

在这里插入图片描述
在这里插入图片描述

途中rear都是入队计算后的rear值。

在少用一个元素的情况下,满足(S->rear+1)%MAXSIZE) == S->front 表示队满。

因此, 在循环队列中队空和队满的条件是:
队空的条件:Q.front = Q.rear
队满的条件:(Q rear+ 1)%MAXSIZE = Q.front

#include<stdio.h>
#define MAXSIZE 5
typedef struct Queue{int datas[MAXSIZE];int front;int rear;
}SqQueue;//入队
int Push(SqQueue *S,int e){if( (S->rear+1)%MAXSIZE ==S->front) return 0;S->datas[S->rear] = e;S->rear = (S->rear+1)%MAXSIZE;return 1;
}//出队
int Pop(SqQueue *S){int e = S->datas[S->front];S->front = (S->front+1)%MAXSIZE;return e;
}int main(){SqQueue S;S.front = S.rear =0;Push(&S,3);Push(&S,5);Push(&S,7);int e = Pop(&S);printf("%d\n",e);int e1 = Pop(&S);printf("%d\n",e1);int e2 = Pop(&S);printf("%d\n",e2);return 0;
}

链队是指采用链式存储结构实现的队列。和顺序队列一样链对也需要队头和队尾游标,并以链表为存储结构。链队就是后插法创建链表。


http://www.ppmy.cn/news/399784.html

相关文章

electron 安装包美化

项目演示 github地址 gitee地址 视频展示 ranAdmin-electron 因为electron 自带 nsis 安装包美化还是选择从nsis 入手 还真的有一家公司专门做electron 安装包美化的 利洽科技-nsNiuniuSkinUI nsNiuniuSkinUI 刚好有免费版 免费版只需要替换一下参数 参数 基本上就能符合要…

OpenAI深夜放毒:发布GPT-4新模型,GPT-3.5支持16K上下文,并且价格降低75%

一觉起来&#xff0c;发现OpenAI Twitter更新了&#xff0c;而且更新力度很大&#xff0c;这真是深夜放毒。 下面我们看下OpenAI本次的重大更新都有哪些&#xff1f; 函数调用能力 在Chat Completions API中引入了新的功能调用能力。gpt-4-0613和gpt-3.5-turbo-0613版本已进行了…

在vuepress博客添加樱花特效(vue樱花组件源码)

文章目录 写在前面樱花的源码在vuepress使用 写在前面 写过博客的同学都知道&#xff0c;飘落樱花是一个比较常见的博客特效。 平时都是用插件来实现的&#xff0c;有想过去了解它到底是怎么实现的吗&#xff1f; 它是用canvas实现的就针对vuepress&#xff0c;我们需要写一个…

三月,和她一起看一次樱花吧(vue实现樱花漫天效果)

目录 1 前言2 樱花雨实现2.1 环境2.2 效果2.3 源码与源图2.4 踩坑 1 前言 去年三月 她的长发在风中随樱花起舞 难以忘怀的不止是樱花 更是她的笑靥 此时此刻 恰如彼时彼刻&#xff1b; 希望各位能与命中注定的他或她&#xff0c;在樱花雨中来一场邂逅&#xff1b; 2 樱花雨实现…

樱花树(2)

Hi~ o(*&#xffe3;▽&#xffe3;*)ブ大家好今天我又来分享代码啦&#xff01;还是老样子不喜勿喷mua 原码如下&#xff1a; from turtle import * from random import * from math import * def tree(n,l): pd()#下笔 #阴影效果 t cos(radians(heading()45)…

酷炫樱花飞舞

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <HTML><HEAD><TITLE>樱花飞舞</TITLE><META NAME"Generator" CONTENT"EditPlus"><META NAME"Author" CONTENT""&…

樱花樱花想见你:关于不一样的爱

樱花樱花想见你 歌曲起源 编辑 作者高野健一的创作灵感来源于 西加奈子写的小说《樱》 [2] &#xff0c;该小说讲诉了一条叫“樱”的小狗与其主人一家的感人故事。高野健一据此在歌词中构造一个失去女儿 [3] 的父亲的形象&#xff0c;并以此展开后续歌词创作。 本系列歌曲共有三…

P1833 樱花

文章目录 R e s u l t Result Result H y p e r l i n k Hyperlink Hyperlink D e s c r i p t i o n Description Description S o l u t i o n Solution Solution C o d e 1 Code1 Code1 C o d e 2 Code2 Code2 R e s u l t Result Result H y p e r l i n k Hyperlink Hyper…