1. 程式人生 > >UVA Rails(stl-stack)

UVA Rails(stl-stack)

需要 amp radi 序號 uva ati 表示 == 我們

具體思路是從B方向的序列 倒推 棧C 的入棧出棧順序, 以B方向的5,4,3,2,1為例子:從一個數字5開始,要想從棧C拿到5號車廂,5號車廂得入棧C,且5號車廂處於棧頂位置,為了保證5號車 廂在棧C中,必須把1,2,3,4,5(小於等於5的車廂)壓入棧C中,入棧操作完畢後,然後取出棧頂元素,此時取出來的是5,和B 方向的第一個數字5一致,我們接著看B方向的第二個數字4,因為4號車廂已壓入棧C中,所以不需要入棧操作,直接取出棧頂元素, 進行對比,此時取出來的棧頂元素正是4,符合要求,接下來看B方向的第三個數字3,後面就依次類推了 下面我們以5 4 1 2 3為例子: 還是從B方向的第一個數字開始,這個數字是5,所以依次把1 ,2,3,4,5壓入棧C中,然後取出棧頂元素5,與B方向的第一個數字 5一致,然後校驗B方向的第二個數字4,由於4已經入棧了,取出棧頂元素,取出來一看是4,符合,然後校驗B方向第三個數字1,由於 4已經入棧了,取出棧頂元素,取出來一看是3,不等於數字1,所以 5 4 1 2 3 是一個非法序列。 由於station符合後進先出規則,可以用一個stack<int>來表示station。 然後采用模擬的規則來寫,因為進入station是按照編號遞增進入,所以可以用aId變量表示。 接下來就是模擬時候應該註意的條件,我們知道有以下兩種情況,一種是一進來station,就出station 也就是 aId == coaches[lenB];一種是進來時還不出站,那麽這時候就要s.push(aId)//壓棧,但是這一種的條件呢? 我們如果可以排除掉第一種,那麽無非就是第二種了。但是我們要知道,在進站之前,如果站臺裏有車它是可以先出站的 ,這種狀態就條件就是 !s.empty() && s.top() == coaches[lenB].所以只要按照順序判斷這幾個條件 就可以寫出這個模擬程序了。 入棧 1 2 3 4 5 int A=1(靜態棧頂指針) 出棧 5 4 3 2 1 int B=1(數組計數器) 將A壓入棧 5 4 3 2 1 A 取棧頂元素 (A++)5 4 3 2 1== (B++)5 4 3 2 1 √ 入棧 1 2 3 4 5 A 出棧 5 4 1 2 3 B 將A壓入棧 5 4 3 2 1 取A棧頂元素 5==5 與B順序對比 4==4 3!=1... × //特殊情況 入棧 1 2 3 4 5 A 出棧 1 2 3 4 5 B 將A壓入棧 5 4 3 2 1? //特殊情況 if(入棧順序==出棧順序) 向後遍歷一下 if(A==t[B]) { A++; B++; } //普通情況 else if(棧非空 and 棧頂元素與出棧的火車相同) 出棧(s站 出棧的向後遍歷一下(火車序號 else if( !s.empty() && s.top()==t[B] ) { s.pop(); B++; } else if(棧頭未遍歷結束/進棧與出棧順序不同) 將A壓入棧push(A++) else if( A<=n ) { s.push(A); A++; //等價s.push(A++); } 否則不滿足 No else { flag=0; //不滿足出棧順序 break; }

UVA Rails(stl-stack)