办事大厅排队算法

做题过程中发现了一些小细节,来给大家分享一下。

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);
  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值