数据结构:C_队列的顺序表示和实现

数据结构:队列的顺序表示和实现(C语言版)



1.写在前面

  附:C_队列的链式表示和描述

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

    

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

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

  理解:

    何谓循环队列?如下图

          

    图中有两个指针(其实就是两个整数型变量,因为在这里有指示作用,所以这里理解为指针)front、rear,一个指示队头,一个指示队尾。rea和front互相追赶着,这个追赶过程就是队列添加和删除的过程,如果rear追到head说明队列满了,如果front追到rear说明队列为空。

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

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

  循环队列的实现过程:

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

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

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

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

        ☆满:当队列添加元素到rear的下一个元素是head的时候,也就是转圈子要碰头了,我们就认为队列满了。

        ☆空:当队列删除元素到head=rear的时候,我们认为队列空了。

  图示:

    

2.代码分解

2.1添加操作

status EnQueue(SqQueue *q,QElemtype e)
{
    //插入到队尾
    if((q->rear+1)%MAXQSIZE==q->front)
        return 0;
    q->base[q->rear]=e;
    q->rear=(q->rear+1)%MAXQSIZE;
    return 1;
}

2.2删除操作

status DeQueue(SqQueue *q)
{
    if(q->front==q->rear)
        return 0;
    printf("%d",q->base[q->front]);
    q->front =(q->front+1)%MAXQSIZE;
    return 1;
}

2.3获取队列长度

int QueueLength(SqQueue *q)
{
    return (q->rear-q->front+MAXQSIZE)%MAXQSIZE;
}

2.4对节点的定义

#define MAXQSIZE 100
typedef int QElemtype;
typedef int status;

typedef struct{
    QElemtype *base;
    int front;
    int rear;
    }SqQueu

2.5测试方法

void main()
{
    SqQueue *q;
    q=(SqQueue*)malloc(sizeof(SqQueue));
    q=InitQueue(q);
    EnQueue(q,5);
    EnQueue(q,4);
    EnQueue(q,3);
    EnQueue(q,2);
    EnQueue(q,1);
    printf("队列长度为:%d\n",QueueLength(q));
    DeQueue(q);
    DeQueue(q);
    DeQueue(q);
    DeQueue(q);
    DeQueue(q);
}

      

        

  

    

  

  

时间: 2024-08-07 19:27:12

数据结构:C_队列的顺序表示和实现的相关文章

数据结构Java实现07----队列:顺序队列&顺序循环队列、链式队列、顺序优先队列

数据结构Java实现07----队列:顺序队列&顺序循环队列.链式队列.顺序优先队列 一.队列的概念: 队列(简称作队,Queue)也是一种特殊的线性表,队列的数据元素以及数据元素间的逻辑关系和线性表完全相同,其差别是线性表允许在任意位置插入和删除,而队列只允许在其一端进行插入操作在其另一端进行删除操作. 队列中允许进行插入操作的一端称为队尾,允许进行删除操作的一端称为队头.队列的插入操作通常称作入队列,队列的删除操作通常称作出队列. 下图是一个依次向队列中插入数据元素a0,a1,...,an-

基本数据结构,循环队列的顺序实现。

队列是一种先进先出的数据结构,这里用顺序结构将其实现. 1.首先用结构体定义一个队列,front指向队首元素的前面一位,real指向队尾元素. 1 //队列的结构定义 2 #define MAX 6 3 typedef struct { 4 int front,real; 5 int data[MAX]; 6 }queue; 2.创建一个循环队列,初始化令front=real=0,因为当队列满时也有front=real,此时无法判断队满:所以我们弃置一个元素位不用,其位置随机,所以队列的实际最大

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

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

java数据结构与算法之顺序表与链表深入分析

转载请注明出处(万分感谢!): http://blog.csdn.net/javazejian/article/details/52953190 出自[zejian的博客] 关联文章: java数据结构与算法之顺序表与链表设计与实现分析 java数据结构与算法之双链表设计与实现 ??数据结构与算法这门学科虽然在大学期间就已学习过了,但是到现在确实也忘了不少,因此最近又重新看了本书-<数据结构与算法分析>加上之前看的<java数据结构>也算是对数据结构的进一步深入学习了,于是也就打算

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

參考书目:<数据结构(C语言版)>,严蔚敏 怎样将<数据结构>中的知识应用到如今的工作中呢(单片机C编程.数字信号处理算法),希望在这里可以得到各位的指点.这个程序是我自己用循环队列实现了一个简单的应用模型(得益于一位童鞋的启示).这里高手如云,希望可以得到很多其它的指点啊! common.h #ifndef _COMMON_H_ #define _COMMON_H_ #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR

数据结构专题——队列

一.队列(queue)(可与栈对比进行学习) 思想:队列实现的是一种先进先出(first-in,first-out,FIFO)策略.(<算法导论>) 定义:队列是只允许在一端进行插入操作,而在另一端进行删除操作的线性表(具有线性关系/前驱后继关系).(<大话数据结构>) 术语: 队列的两端:队头(head):进行删除操作的一端.队尾(tail):进行插入操作的一端. 操作:队列的插入操作(insert):入队(enqueue). 队列的删除操作(delete):出队(dequeue

数据结构丨队列和栈

队列 先入先出的数据结构 在 FIFO 数据结构中,将首先处理添加到队列中的第一个元素. 如上图所示,队列是典型的 FIFO 数据结构.插入(insert)操作也称作入队(enqueue),新元素始终被添加在队列的末尾. 删除(delete)操作也被称为出队(dequeue). 你只能移除第一个元素. 示例 - 队列 入队:您可以单击下面的 Enqueue 以查看如何将新元素 6 添加到队列中. ? Enqueue 出队:您可以单击下面的 Dequeue 以查看将删除哪个元素. Dequeue

数据结构之队列and栈总结分析

一.前言: 数据结构中队列和栈也是常见的两个数据结构,队列和栈在实际使用场景上也是相辅相成的,下面简单总结一下,如有不对之处,多多指点交流,谢谢. 二.队列简介 队列顾名思义就是排队的意思,根据我们的实际生活不难理解,排队就是有先后顺序,先到先得,其实在程序数据结构中的队列其效果也是一样,及先进先出.    队列大概有如下一些特性: 1.操作灵活,在初始化时不需要指定其长度,其长度自动增加(默认长度为32) 注:在实际使用中,如果事先能够预估其长度,那么在初始化时指定长度,可以提高效率    

java 实现数据结构之队列

转自:http://zengzhaoshuai.iteye.com/blog/1171716 ———————————————————————————————————————————— 队列是一种特殊的线性表,它只允许在表的前端(front)进行删除操作,只允许在表的后端(rear)进行插入操作. 1.队列的顺序存储结构及实现 Java代码   public class SequenceQueue<T> { private int DEFAULT_SIZE = 10; //保存数组的长度. pr