数据结构基础之队列

数据结构基础之队列

数据结构之队列结构:

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.  对于队列的说明

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

 

原文地址:https://www.cnblogs.com/hchlqlz-oj-mrj/p/5159899.html