刷题记录:牛客NC13822Keep In Line

传送门:牛客

又到饭点了,SK同学靠着惯性走到了食堂,但长长的队伍顿时让他失去了食欲。突然,他
注意到某个窗口前的队伍里明显存在插队的现象,于是他默默记录下了同学们进队和出队的变化。    
对于进队,SK同学只知道队伍里多了一个人,并不知道新来的人是老老实实站到了队尾还
是插到了队伍里的某个位置;对于出队,SK同学能确定是队伍里站在最前面的人出队了。
初始时队伍为空,给出n条队伍进出的信息,保证已经出队的同学不会再入队,并且最终队
伍也为空,现在SK同学想知道有多少不插队的好同学。
输入:
1
6
in quailty
in hwq1352249
out hwq1352249
in zhuaiballl
out quailty
out zhuaiballl
输出:
2

主要思路:运用队列的思维来储存每一个进入和出去的人,具体到代码中遇到inpush,遇到out就判断该人名是否是队列中的第一个(第一个的话就是没有插队的,反之则是插队),如果是插队的话就用map来记录一下,当然前面判断的时候也要判断map中的值是否合法(即之前有没有插队过,如果插队过显然是已经走了的,直接pop()就行)

注意点:队列和栈一样,如果内容为空直接进行pop(),top()之类的操作会出问题,需要提前进行判断!!

#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <vector>
#include <map>
#include <set>
#include <queue>
#include <string.h>
#include <stack>
using namespace std;
typedef long long ll;
#define inf 0x3f3f3f3f
#define root 1,n,1
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
inline ll read() {
	ll x=0,w=1;char ch=getchar();
	for(;ch>'9'||ch<'0';ch=getchar()) if(ch=='-') w=-1;
	for(;ch>='0'&&ch<='9';ch=getchar()) x=x*10+ch-'0';
	return x*w;
}
#define maxn 1000000
stack<char>aa;
string a;
char ans[10000];
int main() {
	while(cin>>a) {
		memset(ans,'\0',sizeof(ans));
		aa.push(a[0]);
		for(int i=1;i<a.size();i++) {
			if(aa.size()!=0&&aa.top()=='O'&&a[i]=='O') {
				aa.pop();
			}
			else if(aa.size()!=0&&aa.top()=='o'&&a[i]=='o') {
				aa.pop();
				if(aa.size()!=0&&aa.top()=='O') aa.pop();
				else aa.push('O');
			}
			else {
				aa.push(a[i]);
			}
		}
		int Ans=0;
		while(aa.size()!=0) {
			ans[++Ans]=aa.top();
			aa.pop();
		}
		for(int i=Ans;i>=1;i--) {
			cout<<ans[i];
		}
		cout<<endl;
	}
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值