1. 程式人生 > >牛客網 A-吐泡泡 棧的模擬

牛客網 A-吐泡泡 棧的模擬

時間限制:C/C++ 1秒,其他語言2秒
空間限制: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 ;
}