1. 程式人生 > >棧與隊列專題

棧與隊列專題

入棧 sta 升序 實現 sem 數據結構 遞歸 一個隊列 color

1.定義棧的數據結構,請在該類型中實現一個能夠得到棧最小元素的min函數。

  方法:1.使用兩個棧 stackData,stackMin,一個記錄數據,另一個棧確保棧頂是當前數據棧的最小元素

     2.入棧:若stackMin空,則直接入,否則如果當前元素小於等於棧頂元素,入棧,否則,不入。

     3.出棧:如果從stackData出來的元素於當前stackMin元素棧頂相同,stackMin進行一次出棧。

private Stack<Integer> stack=new Stack<>();
    private Stack<Integer> min=new
Stack<>(); public void push(int node) { stack.push(node); if(min.isEmpty()||node<=min.peek()) min.push(node); } public void pop() { int value=stack.pop(); if(!min.isEmpty()&&value==min.peek()) min.pop(); }
public int top() { return stack.peek(); } public int min() { return min.peek(); }

2.用棧實現隊列的功能

  問題:用兩個棧結構實現隊列,支持隊列的基本操作(push,pop,peek)

  方法:使用一個棧壓入,使用另一個棧彈出。如隊列1 2 3 4 5,壓入棧時依次入棧,

     在棧內就是1 2 3 4 5 ,5是棧頂,將此棧元素倒入另一個棧,

     在棧內就是5 4 3 2 1,1是棧頂,依次出棧就是一個隊列。

  要點:將元素從壓入棧倒入彈出棧時,需確保彈出棧為空且壓入棧已全部倒入。

3.將棧逆序,要求不能使用額數據結構,只能使用遞歸函數

  方法:1.使用一個get函數,每次取得並移除棧底元素,其他元素順序不變。

     2.使用一個reverse函數,每一層都調用一次get,當每一層返回時,將get得到的元素入棧,最後即得到逆序棧。

 public  int get(Stack<Integer> stk) {
        int value=stk.pop();
        int last=value;
        if(!stk.isEmpty()) {
            last=get(stk);
            stk.push(value);
        }
        return last;
    }
    
    public  void reverse(Stack<Integer> stk) {
        int ele=get(stk);
        if(!stk.isEmpty())
            reverse(stk);
        stk.push(ele);
    }

4.按升序對棧進行排序(即最大元素位於棧頂),要求最多只能使用一個額外的棧存放臨時數據

  分析:類似於第一個帶最值的棧的問題,使用一個輔助棧,

    從數據棧依次彈出元素,如果不大於輔助棧棧頂,則入輔助棧,否則,依次從輔助棧彈入到數據棧,直到能夠入輔助棧。

    最後數據棧全部壓入輔助棧,則將輔助棧全部倒入數據棧,完成排序。

棧與隊列專題