牛客15029数泡泡

牛客15029数泡泡

时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 32768K,其他语言65536K
64bit IO Format: %lld
题目描述
小鱼儿吐泡泡,嘟嘟嘟冒出来。小鱼儿会吐出两种泡泡:大泡泡"O",小泡泡"o"。
两个相邻的小泡泡会融成一个大泡泡,两个相邻的大泡泡会爆掉。
(是的你没看错,小气泡和大气泡不会产生任何变化的,原因我也不知道。)
例如:ooOOoooO经过一段时间以后会变成oO。
输入描述:
数据有多组,处理到文件结束。
每组输入包含一行仅有’O’与’o’组成的字符串。
输出描述:
每组输出仅包含一行,输出一行字符串代表小鱼儿吐出的泡泡经过融合以后所剩余的泡泡。
示例1
输入
复制
ooOOoooO
输出
复制
oO
说明
自左到右进行合并
备注:
对于100%的数据,
字符串的长度不超过100。

题意
通过题意,可将输入字符串分成单个字符,每个字符逐个输入,且每次输入对字符串产生的变化只与该字符相邻的元素有关,根据这个特点,我们很容易看出这是一个简单的栈模拟问题。

解题思路:
1、栈中无元素或栈顶元素与输入元素不相同时,将输入元素压入栈。
2、当栈非空时,判断栈顶元素是否为小泡泡‘o’且输入元素也为小泡泡,这时将栈顶元素出栈,此时并不能将合成的大泡泡’O’直接压入栈中,因为可能栈顶的小泡泡出栈后,栈顶变成了大泡泡,这时需要将大泡泡消去,若栈顶不为大泡泡时,将大泡泡压入栈中。
3、若输入元素和栈顶元素同为大泡泡时,将栈顶元素出栈。
4、将栈顶剩余元素逐个出栈,逆序输出结果。

学习总结
对应于栈与队列的学习最初的基础是要我们做好引用,那最关键的就是对于个函数使用的熟悉头文件也要仔细钻研有了c为开头c++确实易懂快速上手就是作为一个用惯<stdio.h>的弱子还不习惯大量头文件的引用

话不多说,对应解释全写在代码里了待本蒟蒻出代码

#include<bits/stdc++.h>//万能头文件,一般还是老老实实用iosterm satck string吧
using namespace std;
int main(){
    string s;//定义字符串1
    while(cin >> s){
        stack<char> st;//定义栈的类型为字符串
        string str;//定义字符串2(空的,待输入)
        st.push(s[0]);//st为该栈,输入内容字符串s
        for(int i = 1; i < s.length(); i++)//长度作为次数(\0不会被记入)
        {            if(st.empty() || st.top() != s[i])
            {
                st.push(s[i]);//不一样就压入
                continue;   }
            if(!st.empty()&&st.top()==s[i]&&s[i]=='o'){
                st.pop();//如果栈顶不为空(有O或o),栈顶与输入的新字符相同且为o的情况下就删去栈顶字符
                if(!st.empty()&&st.top()=='O') st.pop();//已知之前的两个oo合体为O,在此函数体内直接判断相等为O就再删去
                else st.push('O');//不一样则输该有的O
            }
            else if(!st.empty()&&st.top()==s[i]&&s[i]=='O'){
                st.pop();//直接删
            }
        }
        while(!st.empty())//将栈st倒入str中
        {    str+=st.top();
            st.pop(); }
        for(int i=(int)str.length()-1;i>=0;i--)//之前输入的字符被被压入栈底,因此要倒着输出(栈顶的数字最大str【i】i最大的在栈顶)不然变成Oo的答案
            cout<<str[i];
        cout<<endl;   }   }
``

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值