解题思路

本题是一个很典型的队列问题,符合先进先出的思想,由于一般队列不进行遍历的操作(如果要用到遍历的操作一般就不会使用队列了),解题时需要注意保存单词是否在队中,每次单词进队,查询次数就增加一次,最后返回查询次数即可。

代码实现

#include <iostream>
#include <queue>					
#include <algorithm>

const int N = 1010;

using namespace std;

int res[N];								///< 对应的值来表示状态,0表示不在队中,1表示在队中
queue<int> q;							///< 开一个队列

int main()
{
	int m_lenth = 0						///< 内存大小
    int n = 0							///< 文章单词数量
    int num = 0							///< 用来读入单词
    int cnt = 0;						///< 记录查询次数
	cin >> m_lenth >> n;
	
	for (int i = 0; i < n; i ++ )
	{
		cin >> num;						///< 读入单词
        /*
        *判断单词是否在队中
        *如果不在那就进行入队操作
        */
		if (!res[num])
		{
			if (q.size() != m_lenth)	///< 判断内存大小,如果内存足够直接入队
			{
				q.push(num);			///< 入队
			}
			else						///< 内存不够,先出队,在入队
			{
				res[q.front()] = 0;		///< 先将队头状态改为不在队中
				q.pop();				///< 之后弹出队头
				q.push(num);			///< 入队
			}
			res[num] = 1;				///< 更改状态为在队中
			cnt ++ ;					///< 查询次数加一
		}
	}
	
	cout << cnt << endl;				///< 返回查询次数
	
	return 0;
}

代码额外解释

#include <queue>		///< c++ stl queue头文件
/*队列的一些常用函数*/
queue.push(value);		///< 在队列队尾插入元素value
queue.pop();			///< 弹出队头
queue.empty();			///< 判断队列是否为空,如果为空返回真,否则返回假
queue.size();			///< 返回队列的长度
queue.front();			///< 返回队头元素
queue.back();			///< 返回队尾元素