吐泡泡(数组模拟栈,队列)

小鱼儿吐泡泡,嘟嘟嘟冒出来。小鱼儿会吐出两种泡泡:大泡泡"O",小泡泡"o"。
两个相邻的小泡泡会融成一个大泡泡,两个相邻的大泡泡会爆掉。
例如:ooOOoooO经过一段时间以后会变成oO。

输入描述:

数据有多组,处理到文件结束。
每组输入包含一行仅有'O'与'o'组成的字符串。

输出描述:

每组输出仅包含一行,输出一行字符串代表小鱼儿吐出的泡泡经过融合以后所剩余的泡泡。

输入

ooOOoooO

输出

oO

说明

自左到右进行合并

备注:

对于100%的数据,
字符串的长度不超过100。

分析:

可以用数组模拟来处理,从左至右依次处理。

情况分析:

1.空,即tt<hh,此时可直接将s[i]入栈。

2.  如果hh<=tt,需判断是否有变化,如果sta[tt]是大气泡,并且是s[i]也是大气泡,则出栈,模拟气泡爆掉的过程,如果sta[tt]是小气泡,且s[i]也是小气泡,则先出栈,需判断栈内倒数第二个入栈的是否为大气泡,如果是,还需出栈,否则直接入栈。

 3.输出,则通过hh输出,限制条件为hh<=tt


#include<bits/stdc++.h>
typedef long long ll;
using namespace std;
void solve()
{
  string s;
  while(cin>>s)
  {
     ll hh=0,tt=-1;
      char sta[500];
     for(ll i=0;i<s.size();i++)
     {
         if(hh>tt)
         {
             sta[++tt]=s[i];
         }
         else
         {
             if(sta[tt]=='O'&&s[i]=='O')
             {
                 tt--;
             }
             else if(sta[tt]=='o'&&s[i]=='o')
             {
                 tt--;
               if(hh>tt)
               {
                   sta[++tt]='O';
               }
              else if(sta[tt]=='O')
                  tt--;
                 else
                   sta[++tt]='O';  
             }
             else
                sta[++tt]=s[i];
         }
     }
     while(tt>=hh)
     {
         cout<<sta[hh];
         hh++;
     }
      cout<<'\n';
      
  }
}
int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    solve();
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值