判斷是否為可能的出棧情況 列印所有的出棧可能

2021-08-28 11:29:00 字數 2991 閱讀 5999

poppush城市有一座著名的火車站。這個國家到處都是丘陵。而這個火車站是建於上乙個世紀。不幸的是,那時的資金有限。所以只能建立起一條路面鐵軌。而且,這導致這個火車站在同乙個時刻只能乙個軌道投入使用,因為它缺少空間,兩列火車將無路可走。具體看下圖。

當地的慣例是每一列火車從a方向駛向b方向時候,會用某種方式將車廂重組。假設火車將要到達a方向,擁有n個車廂(n<=1000),這些車廂按照遞增順序標記為1到n。負責從組車廂的領導,必須知道是否能從組車廂讓它駛出b,而這個重組的序列就是a1\a2\a3…an.幫組他並且寫乙個程式來判斷是否可能按照所要求的車廂順序。你可以假設,單個的車廂可以從列車上分離出來,在他們進入站台之前。並且他們可以自由移動,知道它們上了b軌道。你也可以假設在任意時候站台可以放下無數的車廂。但是只要乙個車廂進入站台,它就不能返回a軌道,同時如果它離開了站台駛向b軌道,它就不能返回站台。

1、b中最左邊的數肯定是最先出棧的數。取a中最左邊的數,和其比較。如果相等,說明是直接入棧,緊接著再出棧。

如果不相等,只能入棧,取a中下乙個數字進行比較。

2、b中的數可能是棧頂元素出棧,也可能是a中的元素直接入棧出棧所得。

**:

#include#includeusing namespace std;

int main()

else if(!s.empty()&&s.top()==target[b])//和棧頂元素進行比較

else if(a<=n)//都匹配不成,放入棧中

else //否則,嘿嘿。

} printf("yes\n");

return 0;

}

上面的問題結束,那問總共有多少種出棧方式?能否將他們全部列印出來?首先考慮:n個元素進棧,有幾種出棧方式?

我們把n個元素的出棧個數的記為f(n), 那麼對於1,2,3, 我們很容易得出:

f(1) = 1     //即 1

f(2) = 2    //即 12、21

f(3) = 5     //即 123、132、213、321、231

然後我們來考慮f(4), 我們給4個元素編號為a,b,c,d, 那麼考慮:元素a只可能出現在1號位置,2號位置,3號位置和4號位置(很容易理解,一共就4個位置,比如abcd,元素a就在1號位置)。

分析:1) 如果元素a在1號位置,那麼只可能a進棧,馬上出棧,此時還剩元素b、c、d等待操作,就是子問題f(3);

2) 如果元素a在2號位置,那麼一定有乙個元素比a先出棧,即有f(1)種可能順序(只能是b),還剩c、d,即f(2),     根據乘法原理,一共的順序個數為f(1) * f(2);

3) 如果元素a在3號位置,那麼一定有兩個元素比1先出棧,即有f(2)種可能順序(只能是b、c),還剩d,即f(1),

根據乘法原理,一共的順序個數為f(2) * f(1);

4) 如果元素a在4號位置,那麼一定是a先進棧,最後出棧,那麼元素b、c、d的出棧順序即是此小問題的解,即         f(3);

結合所有情況,即f(4) = f(3) + f(2) * f(1) + f(1) * f(2) + f(3);

規整化,我們定義f(0) = 1;於是f(4)可以重新寫為:

f(4) = f(0)*f(3) + f(1)*f(2) + f(2) * f(1) + f(3)*f(0)

然後我們推廣到n,推廣思路和n=4時完全一樣,於是我們可以得到:

f(n) = f(0)*f(n-1) + f(1)*f(n-2) + ... + f(n-1)*f(0)

具體這公式咋出來的,不清楚,但知道它是對的就成。那如何將他們全部列印出來?

給定入棧順序,輸出所有可能出棧情況及所有情況的總數

1先入棧之後有兩種選擇,1出棧和2入棧,而若2已經入棧之後,在2出棧之前1則不能先行出棧,故對於1我們只需要考慮其在2入棧之前出棧的情況,若1在棧內時2入棧,則1與2只能看成乙個整體。

dostack(輸入佇列,中間棧,輸出佇列)

if(輸入隊列為空)

if(中間棧為空)

輸出輸出佇列中的結果

else

中間棧出棧,放入輸出佇列

dostack(輸入佇列,中間棧,輸出佇列)

else

if(中間棧非空)

新建輸入佇列2、中間棧2、輸出佇列2

中間棧2出棧並放入輸出佇列2

dostack(輸入佇列2,中間棧2,輸出佇列2)

輸入佇列出隊乙個數並壓入中間棧

dostack(輸入佇列,中間棧,輸出佇列)

**:

#include#include#includeusing namespace std;

int count;

void print_queue(queue&out)

else

} else

else

}}int main()

{ int i,n;

while(cin>>n)

{ count=0;

queuein,out;//放在迴圈裡面,就不用清零

stacksmid;

for(i=1;i<=n;i++)

in.push(i);

outstack(in,smid,out);

cout<

要列印所有的情況:那有兩種,列印棧頂元素和列印in的對頭元素。這兩種都得列印。

那隨意誰先列印,誰後列印都行。列印完棧頂元素,遞迴回退,列印in的對頭元素。為了保持原先狀態,呼叫了拷貝構造。

通過入棧出棧判斷是否為回文

1,主要思想 首先定義棧儲存結構包括乙個字元型陣列,和乙個表示棧頂元素的指標的變數top然後在此基礎上設計回文演算法。2,本程式包括四個模組 1 主函式 int main static 4,主函式和其他函式清單 void intestatic stack s bool pushstatic stac...

判斷棧的出棧順序是否正確

一般這種題都是出現在選擇題裡面的,而且元素較少,所以即使我們使用野路子 依次把選項代入測試 也不會花費多少時間。但是,我們總不能一直打游擊啊,當遇到敵人主力的時候無能為力,那就坑了。所以這裡介紹怎樣轉游擊戰為陣地戰,從正面硬剛敵人並且取勝的方法。首先,假設入棧順序是1,2,3,4 正確的出棧順序 其...

「根據入棧順序判斷可能的出棧順序」python語言

題目描述 輸入兩個整數序列,其中乙個序列表示棧的push 入 順序,判斷另乙個序列有沒有可能是對應的pop 出 順序。class stack 實現棧的功能 def init self self.items 判斷棧是否為空 def empty self return self.items none 返...