第五章 队列和queue

第五章 队列和queue

本章与前几章十分相似,用法也较为类似,主要掌握其用法即可。

队列同样是一种访问受限的线性表,他只允许在表的一端进行插入操作,同时在另一端进行删除操作。

  • 允许插入的一段称为队尾,允许删除的一端称为队头
  • 先进入队列的元素会先出队,故队列称为先进先出的线性表。
  • 队列中没有元素时称为空队列

队列的模拟实现

创建

  • 一个足够大的数组充当队列。
  • 一个变量h标记队头位置,即头元素的前一个位置
  • 一个变量t标记队尾位置,即尾元素的位置。

变量(h,t]是一种左开右闭区间,即ht之间的元素是队列中的元素,当然也可以根据个人习惯而改变。

const int N = 100010;

int q[N], h,t;

入队

void push(int x) {
    q[++t] = x;
}

注意:我们从1开始存储有效元素,所以++t

时间复杂度:O(1)

出队

删除队头元素,直接修改队头位置即可。

void pop() {
    h++;
}

注意:这里再使用时需要判断队列中是否为空。

时间复杂度:O(1)

队头

返回队头元素,即h所指的下一个元素。

int front() {
    return q[h+1];
}

时间复杂度:O(1)

队尾

返回队尾元素,即t所指的元素。

int back() {
    return q[t];
}

时间复杂度:O(1)

判空

判断队列是否为空,即判断ht是否相等。

bool empty() {
    return h == t;
}

时间复杂度:O(1)

元素个数

返回队列中元素的个数,即t-h

int size() {
    return t-h;
}

时间复杂度:O(1)

queue

创建

queue<T> q;

T为任意数据类型。

size/empty

q.size();    /* 返回队列中元素个数 */
q.empty();   /* 返回队列是否为空 */

时间复杂度:O(1)

push/pop

q.push(x);  /* 向队尾插入一个元素 */
q.pop();    /* 弹出队头元素 */

时间复杂度:O(1)

front/back

q.front();  /* 返回队头元素,不会删除 */
q.back();   /* 返回队尾元素,不会删除 */

时间复杂度:O(1)

你可能感兴趣的:(数据结构及STL,算法,数据结构)