数据结构 - 队列(二)

循环队列的表示和实现

定义

用一组地址连续的存储单元依次存放从队头到队尾的元素。还需要附设两个整型变量:front指示队头元素的位置,rear指示队尾元素的下一个位置

算法

const int MAXSIZE=128;
typedef struct Squeue{
  Elemtype elem[MAXSIZE];
  int front;
  int rear;
}Squeue;

队列的基本形态

  • 空队列

  • 非空队列

假溢出的解决办法

什么是假溢出

当Q.rear == MAXSIZE时,表示队满,但队列中还有空闲单元,称为“假溢出”

解决办法

把队列设想为一个循环的表,将Q. elem[0]接在Q.elem[MAXSIZE-1]之后,即如果Q.rear == MAXSIZE则令

Q.rear=0

入队:Q.rear = (Q.rear+1) % MAXSIZE

出队:Q.front = (Q.front+1)%MAXSIZE

.

如何判断队空和队满

步骤:

  • 设一标志位
  • 空出一个存储空间

J1 J2—-J6相继入队后,此时Q.rear=6定为队满 即:(Q.rear+1)%7 == Q.front

循环队列满的条件

(Q.rear +1 ) % MAXSIZE == Q.front

循环队列的基本操作

初始化为空队列

Q.front = Q.rear =0

求队长

i=(Q.rear-Q.front+MAXSIZE)%MAXSIZE

入队

if ((Q.rear+1) % MAXSIZE == Q.front)
    return ERROR; //队列满
    Q.elem[Q.rear] = e;
    Q.rear = (Q.rear+1) % MAXSIZE;

Q.elem[Q.rear] = e 入队修改尾标志

出队

if (Q.front == Q.rear)
   return ERROR;
   e = Q.elem[Q.front];
   Q.front = (Q.front+1) % MAXSIZE

双端队列

双端队列是限定插入和删除操作在表的两端进行的线性表

输出受限的双端队列

一个端点允许插入和删除,另一个端点只允许插入的双端队列

输入受限的双端队列

一个端点允许插入和删除,另一个端点只允许删除的双端队列

时间: 2024-10-09 01:50:16

数据结构 - 队列(二)的相关文章

数据结构实验之栈与队列二:一般算术表达式转换成后缀式

数据结构实验之栈与队列二:一般算术表达式转换成后缀式 Description 对于一个基于二元运算符的算术表达式,转换为对应的后缀式,并输出之. Input 输入一个算术表达式,以‘#’字符作为结束标志. Output 输出该表达式转换所得到的后缀式. Sample Input a*b+(c-d/e)*f# Output ab*cde/-f*+ #include <stdio.h> #include <stdlib.h> char s[100005]; //分配栈的大小 int m

基本数据结构-队列的实现及其运用

二.队列 队列是一种先进先出的数据结构,元素只能添加到队尾,而对元素的删除,修改,检索只能在队头进行.与栈的差异是很明显的.同样队列的实现可以基于链表,也可以基于数组.和栈的基本操作差不多,但队列多了一个指针(标号)指向末尾的元素,因为需要在末尾插入元素. 1.队列的链表实现 #ifndef QUEUE_H #define QUEUE_H #include <iostream> template <class T> class queue { public: queue(); ~q

数据结构--队列实现(顺序队列和链队列)与C++模板

数据结构--队列实现(顺序队列和链队列)与C++模板 一.顺序队列 队列的顺序存储结构称为顺序队列,顺序队列实际上是运算受限的顺序表. ①和顺序表一样,顺序队列用一个向量空间来存放当前队列中的元素. ②由于队列的队头和队尾的位置是变化的,设置两个指针front和rear分别指示队头元素和队尾元素在向量空间中的位置,它们的初值在队列初始化时均应置为0. 注意: ①当头尾指针相等时,队列为空. ②在非空队列里,队头指针始终指向队头元素,尾指针始终指向队尾元素的下一位置.(所以以下循环顺序队列中当队尾

数据结构之二叉堆、堆排序

前言 上一篇写了数据结构之二叉搜索树.AVL自平衡树,这次来写堆. 堆的创造者 很久以前排序算法的时间复杂度一直是O(n^2), 当时学术界充斥着"排序算法不可能突破O(n^2)"的声音,直到1959年,由D.L.Shell提出了一种排序算法,希尔排序(Shell Sort),才打破了这种不可能的声音,把排序算法的时间复杂度提升到了O(n^3/2)! 当科学家们知道这种"不可能"被突破之后,又相继有了更快的排序算法,"不可能超越O(n^2)"彻底

Java数据结构之二叉搜索树

Java数据结构之二叉搜索树 1.二叉搜索树组成 二叉搜索树又称为二叉排序树,它或者是一颗空树,或者是一颗具有如下特性的非空二叉树,需要满足一下三个条件: (1)若它的左子树非空,则左子树上所有结点的关键字均小于根结点的关键字: (2)若它的右子树非空,则右子树上所有结点的关键字均大于(可以等于)根结点的关键字. (3)左子树右子树本身又各是一颗二叉搜索树 在算法描述中,均以结点值的比较来代表其关键字的比较,因为若结点的值为类类型时,该类必须实现系统提供的java.lang.comparable

2、蛤蟆的数据结构进阶二静态查询之顺序查询

2.蛤蟆的数据结构进阶二静态查询之顺序查询 本篇名言:"我从不把安逸和快乐看作是生活的本身 --这种伦理基础,我叫它猪栏的理想. --爱因斯坦" 这篇我们来看下静态查询中的顺序表查询. 我们先来看下概念,然后是代码实现. 欢迎转载,转载请标明出处:http://blog.csdn.net/notbaron/article/details/47175103 1.  查找 在计算机科学中定义为:在一些(有序的/无序的)数据元素中,通过一定的方法找出与给定关键字相同的数据元素的过程叫做查找.

数据结构—队列

数据结构-队列 1.队列的定义 队列(Queue)也是一种运算受限的线性表,它的运算限制与栈不同,是两头都有限制,插入只能在表的一端进行(只进不出),而删除只能在表的另一端进行(只出不进),允许插入的一端称为队尾(rear),允许删除的一端称为队头 (Front) 队列模型 2.队列的操作 队列的操作原则是先进先出的,所以队列又称作FIFO表(First in First out) 置空队:InitQueue(Q) 判队空:QueueEmpty(Q) 判队满:QueueFull(Q) 入队:En

D&amp;F学数据结构系列——二叉堆

二叉堆(binary heap) 二叉堆数据结构是一种数组对象,它可以被视为一棵完全二叉树.同二叉查找树一样,堆也有两个性质,即结构性和堆序性.对于数组中任意位置i上的元素,其左儿子在位置2i上,右儿子在左儿子后的单元2i+1中,它的父亲在[i/2](向下取整)中. 因此,一个数据结构将由一个数组.一个代表最大值的整数.以及当前的堆的大小组成.一个典型的优先队列(priority queue)如下: 1 #ifndef _BinHeap_H 2 struct HeapStruct; 3 type

数据结构(二)链表的实现

链表定义:(java版)一种递归的数据结构,他或者为空,或者是指向一个节点的引用,该节点含有一个泛型的元素和指向另一个链表的引用.在这个定义中,节点是一个可能含有任意数据类型的抽象实体,这也是为什么使用泛型来表示的原因. 一:链表构造,节点概述 我们可以使用Node来表示一个结点: private class Node{ Item item;//泛型类型 Node next;//执行下一个节点的引用 } 有必要说明参数item和next的含义:Item:泛型参数,它就好比一个占位符,表示我们希望

java数据结构队列

队列类似于现实生活中的排队.队列是先进先出的原则,只允许在队列头部去除元素,队列尾部添加元素. 下面是分别用数组和链表为存储结构实现的队列 public interface Queue<T> { int size(); T remove(); void add(T element); boolean isEmpty(); void clear(); boolean hasElement(); } public class ArrayQueue<T> implements Queue