1. 程式人生 > 其它 >用一個棧實現另一個棧的排序 & 用棧來求解漢諾塔問題

用一個棧實現另一個棧的排序 & 用棧來求解漢諾塔問題

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

題目:用一個棧實現另一個棧的排序
《程式設計師程式碼面試指南》第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 難度:校★★★☆

(待更新)