链接:https://www.nowcoder.com/acm/contest/74/A
来源:牛客网
题目描述
小鱼儿吐泡泡,嘟嘟嘟冒出来。小鱼儿会吐出两种泡泡:大泡泡"O",小泡泡"o"。
两个相邻的小泡泡会融成一个大泡泡,两个相邻的大泡泡会爆掉。
(是的你没看错,小气泡和大气泡不会产生任何变化的,原因我也不知道。)
例如:ooOOoooO经过一段时间以后会变成oO。
输入描述:
数据有多组,处理到文件结束。
每组输入包含一行仅有'O'与'o'组成的字符串。
输出描述:
每组输出仅包含一行,输出一行字符串代表小鱼儿吐出的泡泡经过融合以后所剩余的泡泡。
很明显的栈:
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<map>
#include<queue>
#include<stack>
#include<string>
#include<iostream>
#include<algorithm>
using namespace std;
#define ll long long
#define da 0x3f3f3f3f
#define xiao -0x3f3f3f3f
#define clean(a,b) memset(a,b,sizeof(a))// 雷打不动的头文件
char chuan[105];
char can[105];
int main()
{
while(~scanf("%s",&chuan)) //输进去所有的泡泡
{
stack<char> zhan; //定义一个栈
int i,j,l=strlen(chuan); //取长度
for(i=0;i<l;++i)
{
if(zhan.size()==0) //如果栈为空,就直接放进去
{
zhan.push(chuan[i]);
continue; //跳过循环
}
if(zhan.top()=='O'&&chuan[i]=='O') //爆炸的情况
{
zhan.pop(); //就踢出去一个栈顶元素
continue; //跳出循环
}
if(zhan.top()=='o'&&chuan[i]=='o') //合二为一的情况
{
zhan.pop(); // 先去掉栈顶元素
if(zhan.size()) //如果 此时还有元素
{
if(zhan.top()=='O') //&&栈顶可消
zhan.pop(); //再消一个
}
else // 没元素了
zhan.push('O'); //把大泡泡放进去
continue; //跳出循环
}
zhan.push(chuan[i]); //如果上述条件都不符合(一个小泡泡+大泡泡)
}
while(zhan.size()) //将栈内元素放到字符串内
{
can[zhan.size()-1]=zhan.top();
zhan.pop();
}
l=strlen(can); //取长度
for(i=0;i<l;++i)
printf("%c",can[i]); //输出格式
printf("\n");
clean(chuan,'\0'); //清空;
clean(can,'\0');
}
}