小鱼儿吐泡泡(栈)

链接: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');
    }
}

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值