做题过程中发现了一些小细节,来给大家分享一下。
1.函数说明
list:队列类,类似于vector,允许快速的插入和删除,但是随机访问却比较慢。
常用的函数有:
back() 返回最后一个元素
begin() 返回指向第一个元素的迭代器
clear() 删除所有元素
empty() 如果list是空的则返回true
end() 返回末尾的迭代器
erase() 删除一个元素
front() 返回第一个元素
pop_back() 删除最后一个元素
pop_front() 删除第一个元素
push_back() 在list的末尾添加一个元素
push_front() 在list的头部添加一个元素
sort() 给list排序
getline:cin 读取数据时,它会传递并忽略任何前导白色空格字符(空格、制表符或换行符)。一旦它接触到第一个非空格字符即开始阅读,当它读取到下一个空白字符时,它将停止读取。因此,当输入类似"hello world"时,会自动略过“ world”,而把“ world”存到缓存区,让后面的输入流来读取缓存区的内容。因此可以用getline来读取整行,包括前导和嵌入的空格,并将其存储在字符串对象中
用法为getline(cin, inputLine);
其中 cin 是正在读取的输入流,而 inputLine 是接收输入字符串的 string 变量的名称
2.题目说明
在郑州大学综合办事大厅,每天陆陆续续有很多人来排队办事。现在你能否写程序帮助老师时刻了解当前办理业务的情况。
输入格式:
第一行一个数字N,表示排队信息或者查询信息条目的数量。
以下N行,每行的内容有以下3种情况
(1) in name 表示名字为name的人员新来到办事大厅,排在队伍的最后。(in和name间存在一个空格,name是名字对应字符串,长度不超过10)。
(2) out 表示当前排在最前面的人已经办理完业务,离开了。
(3) q 表示一次查询,请输出当前正在办理业务的人,也就是队伍的第1个人。如果当前无人办理业务,则输出“NULL”,不包括引号。
输出格式:
请根据以上信息,每次遇到查询时,对应一行输出。如果这时队伍有人,则输出第一个人的姓名,否则输出NULL。
输入样例:
5
in A
out
q
in B
q
输出样例:
在这里给出相应的输出。例如:
NULL
B
3.代码思想
这里我用了一个笨办法,第一次循环先用list1倒序存入数据,然后在第二次循环中,判断list1的尾部数据(也就是输入流的第一个数据)是否为‘in name’,是的话才正序插入list2,也就是说list2只存入name,如果是out,就把list2的尾部数据删除,如果是q,就查询。
4.代码示例
#include <list>
#include <string>
#include <iostream>
using namespace std;
int main()
{
int a;
list<string> list1;
list<string> list2;
cin >> a;
getchar();
for (int i = 0; i < a; i++)
{
string str;
getline(cin, str);
list1.push_front(str);//从头部插入
}
for (int i = 0; i < a; i++)
{
string str;
str=list1.back();//将尾部信息返回给str,最后删除
if (str[0] == 'i' && str[1] == 'n')
{
str.erase(0, 3);
list2.push_back(str);
}
else if (str[0] == 'o' && str[1] == 'u' && str[2] == 't')
{
list2.pop_front();
}
else if (str[0] == 'q')
{
if (list2.empty())
{
cout << "NULL" << endl;
}
else
{
cout << list2.front() << endl;
}
}
list1.pop_back();//删除尾部最后一个字符串
}
return 0;
}
5.实验过程中的问题
这里碰到一个c++里cin和getline一起用的问题
测试结果的时候发现,明明是5次循环,偏偏只给我输入4次
然后发现队列一开始竟然存入了一个“”,后来才发现是cin和getline之间的问题
cin输入a之后,只给a赋值,键盘缓冲区还留着一个回车,在后面的getline里就把回车给拿走了,想要解决这两个函数的问题,还得在两者之间加上一个getchar();这样问题就完美解决了
cin >> a;
getchar();
getline(cin,str);