【卡码网C++基础课 20.排队取奶茶】


题目描述与分析

题目描述:

假设有一家奶茶店,现在有一些人在排队等待取奶茶,同时也有人在取奶茶。 请你设计一个程序模拟这种情况下的奶茶队列管理。
假设每个人取奶茶的时间非常短,可以忽略不计,只需要考虑队列中的操作。
队列操作说明:
1.当操作为 1 时,表示有人已经取走奶茶,从队列中删除该人的信息。
2.当操作为 2 时,表示有新人加入排队,将该人的信息加入队列。
在一系列操作之后,你需要回答:下一个取奶茶的人是谁?

输入描述:
第一行有一个整数 n,代表初始队列有 n 个人。
第二行有 n 个字符串,代表当前奶茶队列中的人。
第三行为一个整数 m,代表接下来将会有 m 次操作。
接下来一共有 m 行,代表共有 m 次操作。
如果是操作 1,那么该行只会有一个数字,代表有人取走了奶茶。
如果是操作 2,那么该行有一个数字和一个字符串,第一个数字 2 表示有人加入了奶茶队列,第二个字符串代表新加入的奶茶队列的人。

输出描述:
输出只有一行,为下一个取奶茶的人。 如果已经没有去奶茶的人了,输出“There are no more people in the queue.”。

输入示例:

5
Giselle Winter Aubree Wrenley Royalty
3
1
1
2 Andrew

输出示例:

Aubree

一、队列

在C++中,队列(Queue)是一种常见的数据结构,它遵循先进先出(FIFO,First In First Out)的原则。这意味着最先进入队列的元素最先被处理。C++标准模板库(STL)提供了queue容器来实现队列操作。
在这里插入图片描述

二、队列的操作

在C++中,你可以使用标准库提供的 std::queue 来创建和操作队列,不过这需要引入头文件queue

// 引入queue头文件
#include <queue>

创建一个队列和创建一个栈的写法是相似的,需要指定队列中元素的类型,不过这也意味着队列中的元素必须是相同的数据类型,下面的代码表示创建一个字符串类型的队列。

queue<string> q; // 创建一个字符串类型的队列

队列的操作有以下几种:
1.入队操作 (push):
使用 q.push(value) 方法将元素添加到队列末尾。队列中的元素会按照插入的顺序进行排列,先进先出的原则使得第一个插入的元素最先被移除。

2.出队操作 (pop):
使用 q.pop() 方法移除队列中的第一个元素,但注意 pop 不返回被移除的元素。要访问队列中的第一个元素,需要先使用 front。

3.访问队列的第一个元素 (front):
q.front() 返回队列中的第一个元素的引用,你可以通过它来查看或修改这个元素。

4.访问队列的最后一个元素 (back):
q.back() 返回队列中最后一个元素的引用,用于查看或修改队列尾部的元素。

5.判断队列是否为空 (empty):
使用 q.empty() 来判断队列是否为空,返回值为布尔类型。

6.获取队列的大小 (size):
q.size() 返回队列中元素的数量。

#include <iostream>
#include <queue>
using namespace std;

int main() {
    // 创建一个int类型的队列
    queue<int> q;

    // 入队元素
    q.push(10);
    q.push(20);
    q.push(30);

    // 访问队列的第一个元素
    cout << "Front element: " << q.front() << endl;  // 输出 10

    // 访问队列的最后一个元素
    cout << "Back element: " << q.back() << endl;  // 输出 30

    // 出队元素
    q.pop();

    // 再次访问队列的第一个元素
    cout << "Front element after pop: " << q.front() << endl;  // 输出 20

    // 获取队列的大小
    cout << "Queue size: " << q.size() << endl;  // 输出 2

    // 判断队列是否为空
    if (q.empty()) {
        cout << "Queue is empty" << endl;
    } else {
        cout << "Queue is not empty" << endl;
    }

    return 0;
}

三、代码编写

照例,先把代码的基础结构搭建好,在使用队列前需要引入头文件queue

#include <iostream>
#include <queue>  // 引入头文件queue
#include <string> // 队列中的元素是字符串类型,需要引入头文件
using namespace std;
int main() {
  int n; // 表示有n个人
  cin >> n; // 输入n
     string name; // 排队队列中人的姓名
}

在循环开始前需要创建一个字符串队列,然后在n次循环中将这n个人的姓名推入到队列中

queue<string> q; // 创建一个队列,用于存储输入的字符串名称
while (n--) { // n次循环
    cin >> name; // 输入姓名
    q.push(name); // 使用push操作将名称推送到队列中
}

队列已经构建完毕,接下来需要接收数字m和m个整数的输入,表示取奶茶的操作,如果数字为1,表示有人取走了奶茶,即出队操作,如果数字为2,表示有人新加入了奶茶队列,即入队操作,这种“如果”的条件,需要使用到if-else结构

cin >> m;  // 输入m, 表示m次操作,不要忘记提前定义m变量
while (m--) { // m次循环
    cin >> opt; // opt表示输入的操作,1表示出队,2表示入队,需要提前定义opt变量
    if (opt == 1 && !q.empty())  { // 注意这里队列为空就不能再弹出了,所以要判断是否为空
      q.pop(); // 出队操作
    } else { 
        cin >> name;
        q.push(name); // 入队操作
    }
}

注意上述操作中,需要考虑出队操作中队列是否为空的情况,当且仅当“操作指令为出队,队列中的元素不为空,即q.empty()为false时”才能出队。

当删除数据结构中的元素时,都应该考虑结构中元素是否已经为空的情况。

当执行完所有操作后,如果队列为空,说明没有取奶茶的人,输出 “There are no more people in the queue…”, 如果仍有元素,则输出下一个取奶茶的人。

if (q.empty()) { // 如果队列为空,输出对应的语句
  cout << "There are no more people in the queue." << endl;
} else { // 如果队列不为空,输出队头元素
    cout << q.front() << endl; // 使用front()操作,获取队头
}

完整代码如下:

#include <iostream>
#include <queue>
#include <string>
using namespace std;
int main() {
    int n, m, opt; // n代表队列长度,m代表操作次数,opt代表输入指令
    string name;
    cin >> n;
    queue<string> q; // 新建一个队列
    while (n--) {
        cin >> name;
        q.push(name); // push操作入队
    }
    cin >> m;
    while (m--) {
        cin >> opt;
        // 注意这里如果队列已经为空就不能再弹出了,所以要判断是否为空
        if (opt == 1 && !q.empty()) q.pop(); // pop操作出队
        else {
            cin >> name;
            q.push(name);
        }
    }
  // empty操作判断队列是否为空
    if (q.empty()) cout << "There are no more people in the queue." << endl;
    else cout << q.front() << endl; // front操作取出队头元素
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值