用一個棧實現另一個棧的排序
阿新 • • 發佈:2018-09-02
help tac 就是 amp 壓入 param push println 圖片
【題目】
一個棧中?元素的類型為整型,現在想將該棧從頂到底按從大到小的順序排序,只許申請一個棧。除此之外,可以申請新的變量,但不能申請額外的數據結構。如何完成排序?
【解答】?
1 package cn.hl.p4; 2 3 import java.util.Stack; 4 5 /** 6 * 題目:一個棧中?元素的類型為整型,現在想將該棧從頂到底按從大到小的順序排序, 7 * 只許申請一個棧。除此之外,可以申請新的變量,但不能申請額外的數據結構。 8 * 如何完成排序? 9 * 10 * 思想:題中給出了兩個棧,我們可以將要排序的棧記為stack,輔助棧記為help。11 * 要實現stack中的元素從頂到底按從大到小排序,則入棧的元素順序應該為:從小到大。 12 * 所以,help棧中元素從頂到底要實現由小到大的順序。那麽這就是解題關鍵了, 13 * 我們只要實現這個就好。 14 * 15 * 步驟:在stack上執行pop操作,彈出的元素記為cur。 16 * 1.若cur小於或者等於help的棧頂元素,則將cur直接壓入help。 17 * (!!!保持help從棧頂到棧底由小到大的順序) 18 * 2.若cur大於help的棧頂元素(註意:若此時將cur壓入help,則會違反help棧19 * 頂到底由小到大的順序),則將help的元素逐一彈出,逐一壓入stack,直到cur小於 20 * 或者等於help的棧頂元素,再將cur壓入help。 21 * 3.重復以上操作,直到stack中的全部元素都壓入到help。最後將help中的所有 22 * 元素逐一壓入stack,即完成排序。 23 * 24 * @author 猩生柯北 25 * 26 */ 27 public class Demo { 28 /** 29 * 用一個棧實現另一個棧的排序 30 * @param stack 31 */32 public static void sortStackByStack(Stack<Integer> stack){ 33 //輔助棧help 34 Stack<Integer> help = new Stack<Integer>(); 35 //判斷。若stack不為空,則執行循環。 36 while(!stack.isEmpty()){ 37 //cur接收stack彈出的元素 38 int cur = stack.pop(); 39 while( !help.isEmpty() && help.peek() > cur){ 40 stack.push(help.pop()); 41 } 42 help.push(cur); 43 } 44 while(!help.isEmpty()){ 45 stack.push(help.pop()); 46 } 47 } 48 49 /** 50 * 測試 51 * @param args 52 */ 53 public static void main(String[] args) { 54 Stack s1 = new Stack(); 55 s1.push(5); 56 s1.push(6); 57 s1.push(7); 58 sortStackByStack(s1); 59 System.out.println(s1.pop()); 60 System.out.println(s1.pop()); 61 System.out.println(s1.pop()); 62 } 63 }
【運行結果】
用一個棧實現另一個棧的排序