用一個棧實現另一個棧的排序 & 用棧來求解漢諾塔問題
阿新 • • 發佈:2021-10-30
用一個棧實現另一個棧的排序
題目:用一個棧實現另一個棧的排序
《程式設計師程式碼面試指南》第5題 P12 難度:士★☆☆☆
該題題解的主要思路是申請2個棧,要排序的棧記為stack,輔助棧記為help,stack棧pop出的元素記為cur;
如果cur比help棧頂的元素小或相等,則壓入help棧;否則,將help棧的元素逐一的壓入stack棧,直到cur小於等於help棧頂元素,再將cur壓入help棧。
一直執行以上操作,直到stack棧的全部元素都壓入了help棧,最後再將help棧的所有元素全部壓入stack棧,完成排序。
我自己想了半天沒想出來這個完美的思路,我的思路就是2個棧互相壓入,第一個棧儲存每次pop出的最小值,第二個棧儲存每次pop出的最大值;
執行5次,這個時候2個棧各自擁有原來一半的資料,最後再將第二個棧的資料全部壓入第一個棧。
過程還是有點繁瑣,涉及到:①每次pop時只能pop掉cnt-i+1(並且不超過cnt)個數據(底下的資料是已經排序號的從小到大或者從大到小的資料)
②每次pop在判斷最值的時候,還得判斷是否為上次的最值,是則直接丟棄,不過注意只能實現一次,不然會把其它相等的數也全部丟棄掉
③最後一步執行完,此時兩個棧的棧頂是相同的,即有一個數據多餘了,要把它pop並且丟棄掉
(光這麼描述就感覺有多繁瑣了┭┮﹏┭┮,當然我自己的思路也沒必要再看,影響了正常題解的思路了)
自己的程式碼同樣不貼了,太繁瑣,以下是牛客網上的題解:
import java.util.Scanner; import java.util.Stack; public class Main { //將棧中的元素排序 public static void sortStackByStatck(Stack<Integer> stack){ Stack<Integer> help = new Stack<Integer> (); while (!stack.isEmpty()){ int cur = stack.pop(); while(!help.isEmpty() && help.peek() < cur) { stack.push(help.pop()); } help.push(cur); } while (!help.isEmpty()) { stack.push(help.pop()); } } public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); Stack<Integer> stack = new Stack<Integer>(); while (n-- > 0) { stack.push(sc.nextInt()); } sortStackByStatck(stack); while (!stack.isEmpty()){ System.out.print(stack.pop() + " ");//但是棧也變成一個空棧了 } } }
用棧來求解漢諾塔問題
題目:用棧來求解漢諾塔問題
《程式設計師程式碼面試指南》第6題 P13 難度:校★★★☆
(待更新)