poppush城市有一座著名的火車站。這個國家到處都是丘陵。而這個火車站是建於上乙個世紀。不幸的是,那時的資金有限。所以只能建立起一條路面鐵軌。而且,這導致這個火車站在同乙個時刻只能乙個軌道投入使用,因為它缺少空間,兩列火車將無路可走。具體看下圖。當地的慣例是每一列火車從a方向駛向b方向時候,會用某種方式將車廂重組。假設火車將要到達a方向,擁有n個車廂(n<=1000),這些車廂按照遞增順序標記為1到n。負責從組車廂的領導,必須知道是否能從組車廂讓它駛出b,而這個重組的序列就是a1\a2\a3…an.幫組他並且寫乙個程式來判斷是否可能按照所要求的車廂順序。你可以假設,單個的車廂可以從列車上分離出來,在他們進入站台之前。並且他們可以自由移動,知道它們上了b軌道。你也可以假設在任意時候站台可以放下無數的車廂。但是只要乙個車廂進入站台,它就不能返回a軌道,同時如果它離開了站台駛向b軌道,它就不能返回站台。
1、b中最左邊的數肯定是最先出棧的數。取a中最左邊的數,和其比較。如果相等,說明是直接入棧,緊接著再出棧。
如果不相等,只能入棧,取a中下乙個數字進行比較。
2、b中的數可能是棧頂元素出棧,也可能是a中的元素直接入棧出棧所得。
**:
上面的問題結束,那問總共有多少種出棧方式?能否將他們全部列印出來?首先考慮:n個元素進棧,有幾種出棧方式?#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個元素的出棧個數的記為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 返...