数据结构—线性结构之队列

1、定义
一种可以实现“先进先出”的存储结构,(不允许中间插入,只能从一端添加或者删除元素)类似于排队买票,不允许插队的情况下先排队的人先买票。)。
2、队列分类
(1)链式队列(由链表实现)
(2)静态队列(由数组实现)
静态队列通常必须是循环队列;
循环队列:
1、静态队列为什么必须是循环队列
每次入队或者出队都是font或者rear向后移动一位,font指针无法往前移动,此时就会造成删除的空间无法使用!

2、循环队列需要几个参数来确定
<1> front参数
<2> rear参数

3、循环队列各个参数的含义
1) 队列初始化
front和rear的值都是0;
2)队列非空
front代表的是队列的第一个元素;
rear代表的是队列的最后一个有效元素
3)队列空
front和rear的值相等,但是不一定为0

4、循环队列入队伪算法
<1>将值存入f 所代表的位置,r向后移动;
<2>错误的写法(r = r+1);正确的写法:r = (r+1)%数组的长度
5、循环队列出队伪算法
<1> f = (f+1)%数组的长度

6、如何判断循环队列是否为空
如果front与rear的值相等,则该队列一定为空

7、如何判断循环队列是否已满
front的值与rear的值大小不确定,也有可能相等;
两种方法:
<1>增加一个标识参数
<2>少用一个元素(通常使用这种方式)
如果f和r 的值相邻,则队列已满:(C语言伪算法如下)
if((r+1)%数组长度 == f)
{
已满
}
else
{
不满
}

队列的操作实现(C语言)

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <string.h>
#include <stdbool.h>

typedef struct Queue
{
        int * pBase;
        int front;
        int rear;
}QUEUE;

void init(QUEUE *);
bool en_queue(QUEUE * ,int val);
void traverse_queue(QUEUE *);
bool full_queue(QUEUE *);
bool out_queue(QUEUE *,int * pVal);
bool empty_queue(QUEUE *);

int main(void)
{
        int val;

      QUEUE Q;
      init(&Q);
   /*   en_queue(&Q,1);
      en_queue(&Q,2);
      en_queue(&Q,3);
      en_queue(&Q,4);
      en_queue(&Q,5);
      en_queue(&Q,6);
      en_queue(&Q,7);
  */
      traverse_queue(&Q);

      if(out_queue(&Q,&val))
      {
              printf("出队成功,出队的元素是:%d\n",val);
      }
      else
      {
              printf("出队失败\n");
      }
      traverse_queue(&Q);

      return 0;
}

//队列初始化
void init(QUEUE *pQ)
{
        pQ->pBase = (int *)malloc(sizeof(int)*6);
        pQ->front = 0;
        pQ->rear = 0;
}

//向队列中放入数据
bool en_queue(QUEUE *pQ,int val)
{
        if(full_queue(pQ))
        {
                return false;
        }
        else
        {
                pQ->pBase[pQ->rear] = val;
                pQ->rear = (pQ->rear+1)%6;
                return true;
        }
}

//判断队列是否已满
bool full_queue(QUEUE *pQ)
{
        if((pQ->rear+1)%6 == pQ->front)
        {
                return true;
        }
        else
        {
                return false;
        }
}

//遍历队列
void traverse_queue(QUEUE *pQ)
{
        int i = pQ->front;
        if(empty_queue(pQ))
        {
                printf("该队列为空\n");
        }
        else
        {
        while (i!=pQ->rear)
        {
                printf("%d ",pQ->pBase[i]);
                i = (i+1)%6;
        }
        printf("\n");
        }
        return ;
}

//判断队列是否为空
bool empty_queue(QUEUE *pQ)
{
        if(pQ->front == pQ->rear)
        {
                return true;
        }
        else
        {
                return false;
        }
}

//出队
bool out_queue(QUEUE *pQ,int * pVal)
{
        if(empty_queue(pQ))
        {
                return false;
        }
        else
        {
                *pVal = pQ->pBase[pQ->front];
                pQ->front = (pQ->front+1)%6;

                return true;
        }
}

**队列的应用:**所有和时间有关的操作都有队列的应用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值