算法设计与分析——医疗队列——华东师范大学2020机试题A——erase使用容易出现野指针

文章目录

题目描述

算法设计与分析——医疗队列——华东师范大学2020机试题A——erase使用容易出现野指针

思路分析

  • 这个读题目就有点困难,其实就是的一个链表元素的移动和读取
    • 命令一:就是将首元素移动到末尾
    • 命令二:就是将特定的元素移动到开头
    • 命令三:就是将查看当前的队首元素
  • 使用STL库中的list即可操作,但是我看了人家的介绍,如果使用这个,可能会出现部分样例超时,如果我自己定义一个简单的链表那?能省时间吗?不知道。

实现源码

#include <iostream>
#include <list>

using namespace std;

/*
 * 描述:解决医疗队列的具体程序
 * 参数:n命令的数目
 *      p排队的人数
 * 返回:无返回值,通过输出决定命令的执行效果
 * 注:命令直接通过控制台进行输入
 */
void medicalQueue(int n,int p){

    //声明一个队列,用来保存所有的病人
    list<int> people;
    for (int i = 1; i <= p; ++i) {
        people.push_back(i);
    }

    //循环遍历所有的命令
    int command;
    for (int i = 0; i < n; ++i) {
        cin>>command;

        //遍历所有的指令,根据指令跳转到不同的情况
        if(command == 1){
            //将队首的元素移动到末尾
            int temp = people.front();
            people.pop_front();
            people.push_back(temp);

        }else if(command == 2){
            //将no编号的病人,移动到队列首部
            int no;
            cin>>no;

            //找到序号为no的病人的位置
            int target;
            list<int>::iterator pointIndex = people.begin();
            for (;pointIndex != people.end(); pointIndex++) {
                cout<<(*pointIndex)<<endl;
                if((*pointIndex) == no){
                    //移动到队列首部
                    target = *pointIndex;
                    people.erase(pointIndex);
                    break;
                }
            }

            //将target移动到队列首部
            people.push_front(target);

        }else if(command == 3){
            //查看队首的元素
            cout<<people.front()<<endl;


        }
    }

}

int main()
{
    //定义测试命令的个数
    int n;
    cin>>n;
    //定义病人的个数
    int p;
    cin>>p;

    medicalQueue(n,p);
    return 0;
}

事故现场

  • 注意,如果你使用的iterator对数列进行迭代,那么注意你将当前iterator指向的变量删除之后,就不能在往后进行变量了,否则会出现野指针的情况
    算法设计与分析——医疗队列——华东师范大学2020机试题A——erase使用容易出现野指针

分析与总结

  • 对应stl中的list有了基本的熟悉,题目不难,但是又重新认识了一个新得知识点,同时知道erase并不能随便删除。
上一篇:【c++】C++中erase的用法


下一篇:外设驱动库开发笔记7:LTC2400系列ADC驱动