<rp id="wnpn7"><ruby id="wnpn7"></ruby></rp>
<progress id="wnpn7"><track id="wnpn7"><rt id="wnpn7"></rt></track></progress>
<ruby id="wnpn7"></ruby>
<ruby id="wnpn7"><blockquote id="wnpn7"><div id="wnpn7"></div></blockquote></ruby>

    1. <em id="wnpn7"><ruby id="wnpn7"><input id="wnpn7"></input></ruby></em>
      1. <button id="wnpn7"><acronym id="wnpn7"></acronym></button><button id="wnpn7"><acronym id="wnpn7"></acronym></button>

        <rp id="wnpn7"><acronym id="wnpn7"></acronym></rp>

        <li id="wnpn7"><object id="wnpn7"><u id="wnpn7"></u></object></li>
        VB.net 2010 視頻教程 VB.net 2010 視頻教程 python基礎視頻教程
        SQL Server 2008 視頻教程 c#入門經典教程 Visual Basic從門到精通視頻教程
        當前位置:
        首頁 > 編程開發 > c#教程 >
        • 程序員必看:實現棧有這兩種策略,有完整分析和代碼實現

        本站最新發布   C#從入門到精通
        試聽地址  
        http://www.squ68.com/eschool/CSharpxin3721/

        程序員必看

        1
        回顧

        普林斯頓大學的程序員必知的算法和數據結構已經推送兩篇:

        1. 程序員必知的算法和數據結構:2500字性能總結

        2. 1800字普林斯頓大學課程濃縮筆記:程序員必知的算法之查找和排序算法

         

        這兩篇中分別總結了程序的時間性能度量指標,典型的時間復雜度類型,Java中類型的空間消耗的量化情況。后一篇考慮計算機中最重要的基礎算法查找和排序算法,這篇可以說是濃縮篇,雖只有1800字,但是絕對的精華。

         

        2
        棧的核心問題

        今天來認識一對非常重要的數據結構:棧(stack)和隊列(queue),分為兩篇,接下來另一篇推送隊列。

         

        相比大家對棧(stack)的基本知識都已經了解了,我們在此直接進入核心問題:棧這個數據結構和行為是怎么實現的?

         

        首先認識一下,棧的基本行為,基本包括如下四個方法:

         

         

        3
        棧的數組實現

        用數組表示棧結構是最簡單的主意,維護一個實例變量 n, 表示棧中元素的個數;維護一個數組 items[] 存儲 n 個元素,棧頂元素存儲在 items[n-1] , 棧底元素存儲在 items[0]. 這種存儲策略方便地實現了棧的后進先出性質。

         

         

        4
        代碼實現

        ArrayStackOfStrings 的代碼實現包括繼承可迭代接口,編寫4個基本方法,都很簡潔,內部借助數組和個數,內部類 ReverseArrayIterator 實現可迭代接口。

         1import java.util.Iterator;
         2import java.util.NoSuchElementException;
         3   //繼承可迭代接口
         4public class ArrayStackOfStrings implements Iterable<String{
         5    private String[] items;  // 內部存儲數組
         6    private int n;           // 棧內元素個數
         7
         8    public ArrayStackOfStrings(int capacity) {
         9        items = new String[capacity];
        10    }
        11
        12    public boolean isEmpty() {
        13        return n == 014    }
        15
        16    public boolean isFull() {
        17        return n == items.length; 
        18    }
        19
        20    public void push(String item) {
        21        items[n++] = item; //直接在數組最后添加元素
        22    }
        23
        24    public String pop() {
        25        return items[--n]; //直接在數組最后移除元素
        26    }
        27
        28    public Iterator<String> iterator() {
        29        return new ReverseArrayIterator();
        30    }
        31
        32    // 自定義的迭代器,不實現Remove接口
        33    private class ReverseArrayIterator implements Iterator<String{
        34        private int i = n-1;
        35        public boolean hasNext()  return i >= 0; }
        36        public void remove()      throw new UnsupportedOperationException();  }
        37           //可以看出棧的遍歷是從索引n-1開始
        38        public String next() {
        39            if (!hasNext()) throw new NoSuchElementException();
        40            return items[i--];
        41        }
        42    }
        43
        44       //測試
        45    public static void main(String[] args) {
        46        int capacity = Integer.parseInt(args[0]);
        47        ArrayStackOfStrings stack = new ArrayStackOfStrings(capacity);
        48        while (!StdIn.isEmpty()) {
        49            String item = StdIn.readString();
        50            if (!item.equals("-")) {
        51                stack.push(item); 
        52            }
        53            else {
        54                StdOut.print(stack.pop() + " ");
        55            }
        56        }
        57        StdOut.println();
        58    } 
        59

         

        5
        能動態擴容的棧的實現方法

         

        上面實現方法數組個數,即容量寫死了,所以一旦數組個數超過容量,將會拋出異常。

         

        為了實現數組元素個數的動態擴容,本方法實現的功能即可做到。

         

        相比上面方法,此方法在 push 時候,考慮是否容積足夠,如果不夠,則開辟元素個數加倍的空間。相似的,如果 pop 時候,如果容積夠大,對容積減半。

         

         

        6
        代碼實現

         

        重點理解 resize()函數,做的事情不僅個數加倍,還要copy原來的元素到新的內存區域,因此此處效率不高。

         1import java.util.Iterator;
         2import java.util.NoSuchElementException;
         3
         4public class ResizingArrayStackOfStrings implements Iterable<String{
         5    private String[] items;     // 同上
         6    private int n = 0;          // 同上
         7
         8    // create an empty stack
         9    public ResizingArrayStackOfStrings() {
        10        items = new String[2]; //開始初始容積為2
        11    }
        12
        13    public boolean isEmpty() {
        14        return n == 0;
        15    }
        16
        17    public int size() {
        18        return n;
        19    }
        20
        21
        22    // resize the underlying array holding the elements
        23    private void resize(int capacity) {
        24        assert capacity >= n;
        25        String[] temp = new String[capacity];
        26        for (int i = 0; i < n; i++)
        27            temp[i] = items[i];
        28        items = temp;
        29    }
        30
        31    // push a new item onto the stack
        32    public void push(String item) {
        33        if (n == items.length) resize(2*items.length);  // double array length if necessary
        34        items[n++] = item;                              // add item
        35    }
        36
        37    // delete and return the item most recently added
        38    public String pop() {
        39        if (isEmpty()) throw new NoSuchElementException("Stack underflow");
        40        String item = items[n-1];
        41        items[n-1] = null;        // to avoid loitering
        42        n--;
        43        // shrink size of array if necessary
        44        if (n > 0 && n == items.length/4) resize(items.length/2);
        45        return item;
        46    }
        47
        48
        49    public Iterator<String> iterator() {
        50
              
        
        
        
          
        相關教程
                
        免费看成年人视频大全_免费看成年人视频在线观看