【題目】
一個棧中元素的類型爲整型,如今想將該棧從頂到底按從大到小的順序排序,只許申請一個棧。除此以外,能夠申請新的變量,但不能申請額外的數據結構。如何完成排序?java
【解答】
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 }