SDUTOJ 1466 双向队列(std::Deque的应用)

Problem Description

      想想双向链表……双向队列的定义差不多,也就是说一个队列的队尾同时也是队首;两头都可以做出队,入队的操作。
现在给你一系列的操作,请输出最后队列的状态;
命令格式:
LIN X  X表示一个整数,命令代表左边进队操作;
RIN X  表示右边进队操作;
ROUT
LOUT   表示出队操作;

Input

第一行包含一个整数M(M<=10000),表示有M个操作;
以下M行每行包含一条命令;
命令可能不合法,对于不合法的命令,请在输出中处理;

Output

输出的第一行包含队列进行了M次操作后的状态,从左往右输出,每两个之间用空格隔开;
以下若干行处理不合法的命令(如果存在);
对于不合法的命令,请输出一行X ERROR
其中X表示是第几条命令;

Sample Input

8
LIN 5
RIN 6
LIN 3
LOUT
ROUT
ROUT
ROUT
LIN 3

Sample Output

3
7 ERROR

根据题给设定,很明显这是一个双端队列的应用。

由于自己实现这个结构太麻烦,所以直接用STL内的deque(double ended queue)就好了

下面对它的结构进行简要说明:

æ¥çæºå¾å

_Map是一个映射函数,不同于std::map,这里的_Map单纯就是一个概念性的起到“主控制区”的一个设定。也就是说_Map每一个小块都对应一段大块空间,从而实现各种操作的需要。

所以有如下的思路:

  1. 利用deque进行模拟即可,注意越界判定(也就是ERROR操作的判断)
#include <iostream>
#include <cstdio>
#include <bits/stdc++.h>
#include <map>
#include <algorithm>
#include <stack>
#include <iomanip>
#include <cstring>
#include <cmath>
#define DETERMINATION main
#define lldin(a) scanf_s("%lld", &a)
#define println(a) printf("%lld\n", a)
#define reset(a, b) memset(a, b, sizeof(a))
const int INF = 0x3f3f3f3f;
using namespace std;
const double PI = acos(-1);
typedef long long ll;
typedef unsigned long long ull;
typedef long double ld;
const int mod = 1000000007;
const int tool_const = 19991126;
const int tool_const2 = 33;
inline ll lldcin()
{
	ll tmp = 0, si = 1;
	char c;
	c = getchar();
	while (c > '9' || c < '0')
	{
		if (c == '-')
			si = -1;
		c = getchar();
	}
	while (c >= '0' && c <= '9')
	{
		tmp = tmp * 10 + c - '0';
		c = getchar();
	}
	return si * tmp;
}
///Untersee Boot IXD2(1942)
/**Although there will be many obstructs ahead,
the desire for victory still fills you with determination..**/
/**Last Remote**/
string command;
int errors[50000];
deque<ll>dq;
ll m, tmp, cnt2 = 0;
int DETERMINATION()
{
	cin >> m;
	for (int i = 1; i <= m; i++)
	{
		cin.get();
		cin >> command;
		//cout << command << " " << tmp << endl;
		if (command[0] == 'L'&&command[1] == 'I')
		{
			cin >> tmp;
			dq.push_front(tmp);
		}
		else if (command[0] == 'R'&&command[1] == 'I')
		{
			cin >> tmp;
			dq.push_back(tmp);
		}
		else if (command[0] == 'L'&&command[1] == 'O')
		{
			if (!dq.empty())//注意越界判定,否则会因为题给的错误操作而Runtime error
				dq.pop_front();
			else
				errors[cnt2++] = i;
		}
		else if (command[0] == 'R'&&command[1] == 'O' )
		{
			if (!dq.empty())
				dq.pop_back();
			else
				errors[cnt2++] = i;
		}
		//cout << cnt2 << endl;
	}
	ll tmp2, cnt = 0;
	while (!dq.empty())
	{
		tmp2 = dq.front();
		dq.pop_front();
		if (cnt == 0)
			cout << tmp2;
		else
			cout << " " << tmp2;
		cnt++;
	}
	cout << endl;
	for (int i = 0;i < cnt2; i++)
		cout << errors[i] << " ERROR" << endl;
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值