【題解】牛客吐泡泡——括號匹配 多組輸入!+簡單棧的運用

題目描述

小魚兒吐泡泡,嘟嘟嘟冒出來。小魚兒會吐出兩種泡泡:大泡泡"O",小泡泡"o"。
兩個相鄰的小泡泡會融成一個大泡泡,兩個相鄰的大泡泡會爆掉。
(是的你沒看錯,小氣泡和大氣泡不會產生任何變化的,原因我也不知道。)
例如:ooOOoooO經過一段時間以後會變成oO。

輸入描述:

數據有多組,處理到文件結束。
每組輸入包含一行僅有’O’與’o’組成的字符串。

輸出描述:

每組輸出僅包含一行,輸出一行字符串代表小魚兒吐出的泡泡經過融合以後所剩餘的泡泡。

輸入

ooOOoooO

輸出

oO

說明

自左到右進行合併

備註:

對於100%的數據,
字符串的長度不超過100。

思路

看完題目第一個想法:搞個棧不就完事了嘛
然後就wa了 雖然確實WA了但是這個鍋 棧不背。。。

思路是這樣:
對輸入的字符串中字符從前往後逐一判斷,若不滿足匹配條件(小o匹配小o或者大O匹配大O)就push進行下一次判斷。

而匹配與否則看當前棧頂元素與當前字符是否相等,相等則匹配,則pop彈出棧頂元素,再進一步考慮爆炸(不再進一步操作)還是聚合成大泡泡(push一個大O)

特別注意遇到小o小o聚合的情況,需要在pop棧頂那個小o之後,再特判一下此時的棧頂元素是否大O,是的話就能匹配上剛剛倆小o聚合的大O,需要爆炸,即直接彈出棧頂的大O。於是輸入字符串ch以後對ch逐位檢查的代碼如下:

if( !st.empty() && st.top() == ch[i] ){
                if( ch[i] == 'O' ){//兩個大泡泡爆炸
                    st.pop();
                }
                else if( ch[i] == 'o' ){//兩個小泡泡合成大泡泡
                    st.pop();
                    if( !st.empty() && st.top() == 'O')//合成大泡泡要注意原來是否還有大泡泡
                        st.pop();
                    else
                        st.push('O');
                }
            }
            else
                st.push(ch[i]);
            i++;

然後就wa了。對。但是我不是在浪費你的時間,代碼和思路都沒啥毛病。

我花了一天時間整明白,一定要注意題目中的細節比如這題數據有多組,處理到文件結束。

意思是隻接受一組輸入是不會通過的。。。完整代碼:

#include<iostream>
#include<stack>
using namespace std;
int main(){
    char ch[105];
    stack<char> st;
    while(cin>>ch){//數據有多組,處理到文件結束!!!!!
        int i = 0;
        while( ch[i] != '\0' ){
            if( !st.empty() && st.top() == ch[i] ){
                if( ch[i] == 'O' ){//兩個大泡泡爆炸
                    st.pop();
                }
                else if( ch[i] == 'o' ){//兩個小泡泡合成大泡泡
                    st.pop();
                    if( !st.empty() && st.top() == 'O')//合成大泡泡要注意原來是否還有大泡泡
                        st.pop();
                    else
                        st.push('O');
                }
            }
            else
                st.push(ch[i]);
            i++;
        }
        string ans = "";
        while(!st.empty()){
            ans += st.top();
            st.pop();
        }
        for(int i = ans.length() - 1; i >= 0; i--)
            printf("%c",ans[i]);
        cout<<endl;
    }
    return 0;
}

可以用我這組數據測試一下

雖然可能也沒什麼luan用

輸入:
oOOoOoOOoooOoOooOo
輸出:
OoOo
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章