算法设计与分析——医疗队列——华东师范大学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指向的变量删除之后,就不能在往后进行变量了,否则会出现野指针的情况
分析与总结
- 对应stl中的list有了基本的熟悉,题目不难,但是又重新认识了一个新得知识点,同时知道erase并不能随便删除。
标签:命令,people,int,command,华东师范大学,队列,erase,2020,pointIndex 来源: https://blog.csdn.net/Blackoutdragon/article/details/119384898