牛客網 A-吐泡泡 棧的模擬
阿新 • • 發佈:2019-01-28
時間限制:C/C++ 1秒,其他語言2秒
空間限制:C/C++ 32768K,其他語言65536K
64bit IO Format: %lld
空間限制:C/C++ 32768K,其他語言65536K
64bit IO Format: %lld
題目描述
小魚兒吐泡泡,嘟嘟嘟冒出來。小魚兒會吐出兩種泡泡:大泡泡"O",小泡泡"o"。
兩個相鄰的小泡泡會融成一個大泡泡,兩個相鄰的大泡泡會爆掉。
(是的你沒看錯,小氣泡和大氣泡不會產生任何變化的,原因我也不知道。)
例如:ooOOoooO經過一段時間以後會變成oO。
輸入描述:
資料有多組,處理到檔案結束。 每組輸入包含一行僅有'O'與'o'組成的字串。
輸出描述:
每組輸出僅包含一行,輸出一行字串代表小魚兒吐出的泡泡經過融合以後所剩餘的泡泡。示例1
輸入
ooOOoooO
輸出
oO
說明
自左到右進行合併
備註:
對於100%的資料, 字串的長度不超過100。
這道題目主要是利用棧的結構,維護一個序列合法的陣列。
首元素先入棧,然後從左至右訪問每一個字元(首元素除外),每次都拿棧頂和當前元素作比較。
如果棧頂是'o', 當前元素也是'o', 那麼棧頂元素變成'O', 這時候要注意新生成的'O'和棧頂下的'O’的衝突,是否棧頂-2 ;
如果棧頂是'O' , 當前元素也是'O',那麼棧頂-1
其餘情況直接入棧。
#include <iostream> #include <cstring> using namespace std ; char text[101] ; char package[101] ; int top = 0 ; int main(){ while( cin >> text ){ top = 0 ; package[++top] = text[0] ; for( int i = 1 ; i < (int)strlen( text ) ; ++i ){ if( package[top] == 'o' && text[i] == 'o' ){ if( top >= 2 && package[top-1] == 'O' ) top -= 2 ; else package[top] = 'O' ; } else if( package[top] == 'O' && text[i] == 'O' ) top-- ; else package[++top] = text[i] ; } for( int i = 1 ; i <= top ; ++i ) cout << package[i] ; cout << endl ; } return 0 ; }