队列的顺序存储实现

队列是和堆栈一样是一种特殊的线性表,和堆栈不一样的地方是是,堆栈是以后进先出的的数据组织方式,而队列则正好相反先进先出的组织方式.

队列又分为两种队列,一种是单向队列,一种是双向队列.
同时,单向队列又可以衍生出单向循环队列.

一般我们选用顺序存储来实现队列的时候,都是构造循环队列,这样可以提高内存空间的利用率.

下面我们来用数组实现一个单向循环队列.

#include <stdio.h>
#include <stdlib.h>
#define MAX_SIZE  9

typedef int ElementType;

struct QNode{
    ElementType data[MAX_SIZE];
    int front;
    int rear;
};

typedef struct QNode* Queue;



/**
 * 入队
 * @param ptrQ
 * @param e
 */
void AddQ(Queue ptrQ , ElementType e){
    //加1求余表示转了一周了,例如我们有9个元素,当我们的front=0的时候,我们的rear =8;
    //此时表示队列已经满了,我们不能再添加元素了,那么如何判断呢,我们知道(rear=8)+1等于9%9 = 0 = front;
    //同样当我们赚了一周之后,front = 3, rear = 2; 2+1 = 3 %9 = 3 = front ,因此这样是可以判断的
    if((ptrQ->rear+1)%MAX_SIZE == ptrQ->front){
        printf("队列已满\n");
        return;
    }
    ptrQ->rear = (ptrQ->rear+1) % MAX_SIZE;
    ptrQ->data[ptrQ->rear] = e;
}

/**
 * 出队
 * @param ptrQ
 * @param e
 * @return
 */
int deleteQ(Queue ptrQ,ElementType *e){
    if(ptrQ->rear == ptrQ->front){
        printf("队列已空\n");
        return -1;
    }else{
        *e = ptrQ->data[ptrQ->front];
        ptrQ->front = (ptrQ->front+1) % MAX_SIZE;
        return 0;
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,174评论 19 139
  • 栀桠阅读 252评论 0 5
  • 对反面人物的真实描写。坏人也动容,一部宽容的剧就如一个宽容的老者,他的海纳百川让我们在为各类人物感伤喈呼之时更增添...
    是捂脸怪呀阅读 283评论 0 1
  • 我想说的↓ 努力按自己的意愿过一生……… 晚安^O^
    JJFN叶子阅读 122评论 1 0