一、算法描述

本篇文章讲述的数据结构是,队列,数组模拟队列,也不是循环队列。

队列的结构,完全就是学校食堂排队打饭的那个队列。一个队头,一个队尾,从队头出,从队尾进,排队打饭也是这样hhh。

//用数组模拟的队列定义如下:int hh, tt;int q[N];/*hh表示队头,tt表示队尾(我习惯于表示队尾的下一个位置,可以根据个人习惯来修改)q[N]表示队列*/
  • 队列和栈一样,也不是很难理解的数据结构,重点还是要熟悉应用。

接下来介绍队列的各种操作:初始化操作:

void init(){    hh = tt = 0;}
  • 看个人习惯,我习惯于 \(tt\) 表示队尾的下一个位置,如果表示队尾则初始化应修改为 \(tt = -1;\)

入队:

void push(int x){    q[tt ++ ] = x;    //q[++ tt ] =x;}
  • 队列是在队尾加入元素,所以操作的是 \(tt\) 指针。
  • 以上两种写法的区别就在于,第一种是先存储了 \(x\)\(tt\) 再加;而第二种是 \(tt\) 先加再存储 \(x\)
  • 主要就是个人习惯问题。

出队:

void pop(){    hh ++ ;}
  • 队列出队在队头操作,而且用数组模拟队列也不需要释放这块内存空间,直接让 \(hh\) 指针加一即可。

判空:

bool empty(){    return hh == tt;}
  • 判断队头指针和队尾指针是否相等即可。
  • 另一种情况就是判断 \(hh == tt + 1\)

查询队头元素:

int query(){    return q[hh];}
  • 直接返回队头元素即可。

栈和队列的问题都不是很难,主要还是要多应用,熟练掌握这些数据结构。

二、题目描述

实现一个队列,队列初始为空,支持四种操作:

  1. push x – 向队尾插入一个数 \(x\)
  2. pop – 从队头弹出一个数;
  3. empty – 判断队列是否为空;
  4. query – 查询队头元素。

现在要对队列进行 \(M\) 个操作,其中的每个操作 \(3\) 和操作 \(4\) 都要输出相应的结果。

输入格式

第一行包含整数 \(M\),表示操作次数。

接下来 \(M\) 行,每行包含一个操作命令,操作命令为 push xpopemptyquery 中的一种。

输出格式

对于每个 emptyquery 操作都要输出一个查询结果,每个结果占一行。

其中,empty 操作的查询结果为 YESNOquery 操作的查询结果为一个整数,表示队头元素的值。

数据范围

\(1≤M≤100000,\)
\(1≤x≤10^9,\)
所有操作保证合法。

输入样例:

10push 6emptyquerypopemptypush 3push 4popquerypush 6 

输出样例:

NO6YES4 

三、题目来源 AcWing算法基础课-829.模拟队列四、源代码

#include #include using namespace std;const int N = 100010;int hh, tt;int q[N];void init(){    hh = tt = 0;}void push(int x){    q[tt ++ ] = x;}void pop(){    hh ++ ;}bool empty(){    return hh == tt;}int query(){    return q[hh];}int main(){    int m;    cin >> m;        init();        while (m -- )    {        char s[10];        cin >> s;                int x;                if (!strcmp(s, "push"))        {            cin >> x;            push(x);        }        else if (!strcmp(s, "pop"))        {            pop();           }        else if (!strcmp(s, "empty"))        {            if (empty())    puts("YES");            else    puts("NO");        }        else        {            cout << query() << endl;        }    }        return 0;}