1. 程式人生 > >用一個棧實現另一個棧的排序

用一個棧實現另一個棧的排序

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 }

【運行結果】

技術分享圖片

用一個棧實現另一個棧的排序