zoukankan      html  css  js  c++  java
  • 数据结构基础之队列

    数据结构基础之队列

    数据结构之队列结构:

    1.  队列的特点:

    和栈一样,队列也是在数组的基础上进行出入限制,普通的队列,想排队一样,控制在队尾插入元素,队头删除元素。

    2.  队列的用途:

    在广度优先搜索(BFS)中会用到,比如现在有一个图如下:

    现在从A点出发,把A入队,然后再A出队,首先访问到与A相邻的B、D,也就是B、D入队,A的相邻结点访问完毕,继续出队B,现在访问B的邻点,C入队,然后D出队,访问E,然后C出队,E出队。

    访问顺序为:A(入)->A(出)->B(入)->D(入)->B(出)->C(入)->D(出)->E(入)->C(出)->E(出)  (大致如此)

    在这个搜索中,队列的作用便可以很清晰的看到。

    在程序设计中,广度优先搜索是很重要的一种算法,也很常见,经典的迷宫找最短出路问题就要用到它。

    3.  队列的写法:

    如果自己手写队列的模板的话,可以封装成一个结构体或者类,首先要有元素本体、入队操作、出队操作,这三个是最基本的。比如我要建一个int类型的队列的话,那么可以封装如下:

    (值得一提的是,队列是在队头出队,队尾入队,所以如果直接这样写的话会浪费很多的空间,比如但题目要求的是100个元素不断进行出队入队元素,而你在不断进行出队过程中有可能队头就跑到了99,那么如果只申请100个空间的话,明显是不够的,所以入队的时候,如果r已经等于MAX-1了,可以判断队头是否为0,如果不为0,表示还有空间,那么下一个元素便可以放到0的位置,继续地0、1、2、3存放,循环利用)

     

     1 typedef struct
     2 {
     3   int data[MAX];
     4   int l,r;      //l 指向队头 r 指向队尾的下一个
     5   bool pop(int &x)    //出队
     6   {
     7     if(l==r)    return 0;   //l==r 表示队列里没有东西
     8     x=data[l];
     9     l=(l+1)%MAX;
    10     return 1;
    11   }
    12   bool push(int x)    //入队
    13   {
    14     if((r+1)%MAX==l) return 0; //(r+1)%MAX==l 表示队满
    15     r=(r+1)%MAX;
    16     data[r]=x;
    17     return 1;
    18   }
    19   //上面出队入队的操作等于留了一个空位,这个空位是浪费掉的,大家可以找找!
    20 }Queue;

    如果在一些程序设计比赛,比如acm中,一般不会进行队列的封装,直接用C++封装好的queue就可以了。如下:

    1 #include<queue>
    2 using namespace std;
    3 queue<type> q;
    4 //出队 q.pop();
    5 //入队 q.push();
    6 //显示队头元素 q.front();

    4.  对于队列的说明

    与栈一样,都是数据结构最最基础的一块,要熟练掌握,同时了解一下他的特殊用法,比如单调队列、优先队列等。

     

  • 相关阅读:
    Linux下端口被占用确认
    Debuggex – 超好用的正则表达式可视化调试工具
    URL最大长度
    无需重启 修改计算机名直接生效
    UDP穿越NAT原理(p2p)
    gdb中信号
    锁 (读写锁优先级 写饥饿) (锁竞争引发的高系统调用)
    Loopback接口用途---用作管理地址。
    C/C++调试:gdbserver的简单使用
    总结一下NDK crash排查步骤
  • 原文地址:https://www.cnblogs.com/hchlqlz-oj-mrj/p/5159899.html
Copyright © 2011-2022 走看看