求所有的出棧序列

來源:互聯網
上載者:User

 之前我們談到驗證一個出棧序列是否合法比較容易,簡單類比入棧出棧過程即可。那麼如果需要求出所有合法的出棧序列該怎麼辦呢?
(1)我們之前談到,合法的出棧序列條件:
對於每個已出棧數之後的且小於此數的數都必須按降序排列。例如1 2 5 3 4。對於5來說,後面的3,4都小於5,可是3,4卻是升序的。則肯定不是合法的出棧序列。
由此可以想到我們可以求出所有的全排列,然後從中剔除掉非法序列。顯然,當序列的長度增加時,多餘的計算太多,效率太低。
(2)類比入棧出棧過程,每次都有兩種選擇,要麼入棧要麼出棧。顯然按照遞迴方式是可行的。但是又有一個問題,一般遞迴,很少牽扯到遞迴層次之間資料傳送問題。而類比這個過程時,棧的資訊從上層傳到下層,最後回到上層時,必然棧的狀態早已被下層改了。解決辦法就是,下層返回時,回複棧的原狀態。這樣遞迴就不會出錯了。
代碼如下:(如果大家還有更好的演算法或寫法歡迎大家交流討論。自我感覺我寫的這個不太好)

public class TestStackOut {private static Stack<String> stack = new Stack<String>();//棧private static Stack<String> list = new Stack<String>();//待裝入棧的序列,也用棧來實現private static StringBuffer out = new StringBuffer();//輸出串public static void recur(){//遞迴方法if(stack.empty() && list.empty()){//棧空,序列也空,則輸出System.out.println(out);return;} else if(!stack.empty() && !list.empty()){//棧和序列都不空,要麼入棧要麼出棧//選擇一:出棧String str = stack.pop();out.append(str);recur();out.deleteCharAt(out.length() - 1);//選擇二:入棧。 注意:在入棧之前,應該把之前由於出棧而對out,stack,list造成的影響複原。stack.push(str);str = list.pop();stack.push(str);recur();str = stack.pop(); //入棧操作完後也得複原。list.push(str);} else if(!stack.empty() && list.empty()){String str = stack.pop();out.append(str);recur();//複原out.deleteCharAt(out.length() - 1);stack.push(str);} else if(stack.empty() && !list.empty()){String str = list.pop();stack.push(str);recur();//複原str = stack.pop();list.push(str);}}public static void main(String[] args) {list.push("5");list.push("4");list.push("3");list.push("2");list.push("1");recur();}}

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.