队列的定义、基本操作、顺序实现(初始化,入队,出队)

简介: 数据结构:队列的定义、基本操作、顺序实现(初始化,入队,出队)附有代码讲解

1.队列的定义

队列(Queue):是只允许在一端进行插入,在另一端删除的线性表;

网络异常,图片无法展示
|

  • 入队就是插入操作
  • 出队就是删除操作

特点: 先进先出(FIFO)

重要术语:队头、队尾、空队列

  • 队头:允许删除的一端
  • 队尾:允许插入的一端
  • 空队列:没有任何数据元素

2.队列的基本操作

  • InitQueue(&Q):初始化队列,构造一个空队列Q
  • DestoryQueue(&Q):销毁队列,销毁并释放队列Q所占用的内存空间
  • EnQueue(&Q,x):入队,若队列Q未满,将x加入,使之成为新的队尾
  • DeQueue(&Q,&x):出队,若队列Q非空,删除队头元素,并用x返回
  • GetHead(Q,&x):读对头元素,若队列Q非空,则将队头元素赋值给x

3.队列的顺序实现

用静态数组存放队列元素,在定义一个队头指针,一个队尾指针

#define Maxsize 10
typedef struct{
    ElemType data[MaxSize];
    int front;
    int rear;
}SqQueue;

3.1初始化操作

初始化队列:

void InitQueue(SqQueue &Q){
    Q.rear=Q.front=0;    //初始队头、队尾指针指向0
}

判断队列是否为空:

bool QueueEmpty(SqQueue Q){
    Q.rear==Q.front
        return true
    return false;
}

3.2入队操作

入队操作只能从队尾入队;实现分析:需要先判断队列是否为满,然后将新元素插入队尾,然后修改队尾的指针后移。

bool EnQueue(SqQueue &Q,ElemType x){
    if(队列已经满)
        return false;
    Q.dara[Q.rear]=x;
    Q.rear=Q.rear+1;   
        return true;
}

3.2.1方案一(判空)

如果直接给队尾指针直接后移是会出问题的,当整个静态数组被存满的时候,rear指针就会指向MaxSize,如果依次让对头出队的时候,rear依然是指向MaxSize,所以rear==MaxSize的条件不能判断队列已经满了。所以需要修改为:让队尾指针+1后取模

Q.rear=(Q.rear+1)%MaxSize;

用模运算将储存空间在逻辑上变成了“环状”

网络异常,图片无法展示
|

3.2.2方案二(判空)

用size记录队列的当前长度,初始化size为0。

int size=0;  //初始化时候
size++;   //插入成功
size--;   //删除成功
队列空:size=0;
队列为满:size==MaxSize

3.2.3方案三(判空)

标记位,删除成功的时候tag=0,插入成功的时候tag=1

  • 队列满:front==rear && tag==1
  • 队列空:front==rear && tag==0

3.3出队操作

删除一个队列头元素,并且用x返回

bool DeQueue(SqQueue &Q,ElemType &X){
    if(Q.rear==Q.front)   //判断队列是否为空
        return false;
    x=Q.data[Q.front];
    Q.front=(Q.front+!)%MaxSize;  //队列头指针后移
}

3.4 查队头元素

获得队列头元素值并用x返回

bool GetQueue(SqQueue Q,ElemType &X){
    if(Q.rear==Q.front)   //判断队列是否为空
        return false;
    x=Q.data[Q.front];
    return true;
}
目录
相关文章
|
5月前
|
设计模式 算法 C语言
【CPP】栈、双端队列、队列、优先级队列与反向迭代器
【CPP】栈、双端队列、队列、优先级队列与反向迭代器
|
7月前
|
索引
队列的数组实现
队列的数组实现
28 0
|
7月前
|
存储 算法
数据结构和算法学习记录——特殊线性表之队列-队列的概念、队列结构体类型定义 、基本接口函数、初始化函数、销毁队列函数、入队列函数、判断队列是否为空、出队列函数、读取队头队尾的数据 、计算队列数据个数
数据结构和算法学习记录——特殊线性表之队列-队列的概念、队列结构体类型定义 、基本接口函数、初始化函数、销毁队列函数、入队列函数、判断队列是否为空、出队列函数、读取队头队尾的数据 、计算队列数据个数
53 0
|
8月前
|
存储 调度 C语言
链表,栈,队列的区别及其应用
链表,栈,队列的区别及其应用
|
8月前
|
缓存
队列的实现及操作(链表实现)
队列的实现及操作(链表实现)
|
消息中间件 前端开发 JavaScript
使用数组实现队列
使用数组实现队列
66 0
数组模拟链表、栈、队列
数组模拟链表、栈、队列
49 0
|
存储
队列的定义及基本操作实现(链式)
队列的定义及基本操作实现(链式)
176 0
|
C# C++ 索引
用C#构造一个队列Queue。要求此队列是循环队列,并进行入队、出队的测试。
用C#构造一个队列Queue。要求此队列是循环队列,并进行入队、出队的测试。
219 0
用C#构造一个队列Queue。要求此队列是循环队列,并进行入队、出队的测试。