91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何實現Stack棧

發布時間:2021-10-21 16:50:49 來源:億速云 閱讀:168 作者:iii 欄目:編程語言

這篇文章主要講解了“如何實現Stack棧”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“如何實現Stack棧”吧!

一,Stack源碼分析

Stack,棧,也是數據結構的一種,對于java應用開發者而言,我使用棧的應用場景比較少,一般做做算法類的題會用到,對于實際的應用場景我覺得棧還是比較厲害的一種數據結構,棧的特點嘛,先進后出,后進先出。 

二,方法分析

其實,怎么說呢,我分析過了Vector集合的源碼分析了,然而棧繼承了Vector類,所以,你懂得,棧就是Vector集合的一種特例了,所以,這篇文章會很簡短,但是我還是來分析了。

Vector集合最全面的源碼分析 

2.1,棧結構繼承結構

//記住和理解java類的"單繼承,多實現"的特點哈
public class Stack<E> extends Vector<E> {}
   

2.2,構造函數

//一個無參構造函數
public Stack() {
   }
   

2.3,push()方法

其實,棧也是看作一種集合嘛,集合就是用來裝填數據元素的嘛,所以我們接下來就是分析棧的各種方法了,如何裝填數據元素呢,當然了,我們要看下push()方法了。

public E push(E item) {
   //看下第二步操作
       addElement(item);

       return item;
   }
//第二步操作
public synchronized void addElement(E obj) {
   //modCount的含義下面的這個解釋已經很形象了
   //The number of times this list has been  modified
       modCount++;
   //這一步就是擴容操作了,這里不分析了,可以看下vector源碼分析這篇文章
       ensureCapacityHelper(elementCount + 1);
   //將元素裝填在數組中
       elementData[elementCount++] = obj;
   }
   

2.4,pop()方法

public synchronized E pop() {
       E       obj;
    //第二步操作,獲取棧的大小
       int     len = size();
    //第三步操作,調用peek()方法獲取棧頂元素位置
       obj = peek();
    //第四步操作,將棧頂的元素刪除,就達到了pop()的功能
    //等下一起分析下peek()方法
       removeElementAt(len - 1);

       return obj;
   }
//第二步操作  
   public synchronized int size() {
       //這是一個線程安全的方法,返回集合元素的個數,成員變量elementCount
       return elementCount;
   }
//第四步操作
public synchronized void removeElementAt(int index) {
   //其實,這個不用太關心了
       modCount++;
   //首先,我們刪除一個元素的時候,會先判斷是否存在這個元素的
   //這里index=len-1就是數組空間的最后一個元素
       if (index >= elementCount) {
           throw new ArrayIndexOutOfBoundsException(index + " >= " +
                                                    elementCount);
       }
   //數組空間的起始位置是從0開始的,所以小于0,就需要拋出索引越界的問題
       else if (index < 0) {
           throw new ArrayIndexOutOfBoundsException(index);
       }
   //確定j的位置,便于數組元素的移動
       int j = elementCount - index - 1;
       if (j > 0) {
           System.arraycopy(elementData, index + 1, elementData, index, j);
       }
   //集合元素個數減一
       elementCount--;
   //將移除的元素置為null,和下面注釋表達的一樣的,就是為了觸發gc來回收不可達對象的
   //以便整合內存空間
       elementData[elementCount] = null; /* to let gc do its work */
   }
   

2.5,peek()方法

public synchronized E peek() {
   //獲取集合元素個數
       int     len = size();
 //集合個數長度為0時,再去獲取元素時就應該拋出棧為空的異常
       if (len == 0)
           throw new EmptyStackException();
       return elementAt(len - 1);
   }
//第二步操作
public synchronized E elementAt(int index) {
   //校驗索引是否越界
       if (index >= elementCount) {
           throw new ArrayIndexOutOfBoundsException(index + " >= " + elementCount);
       }
//根據索引下標位置獲取指定位置的元素
       return elementData(index);
   }
//第三步操作
E elementData(int index) {
       return (E) elementData[index];
   }
   

2.6,isEmpty()方法

public boolean empty() {
    //判斷集合size是否等于0
       return size() == 0;
   }
   

2.7,search()方法

public synchronized int search(Object o) {
       int i = lastIndexOf(o);

       if (i >= 0) {
           return size() - i;
       }
       return -1;
   }
//第二步操作
public synchronized int lastIndexOf(Object o) {
       return lastIndexOf(o, elementCount-1);
   }
//第三步操作
public synchronized int lastIndexOf(Object o, int index) {
   //預檢查機制
       if (index >= elementCount)
           throw new IndexOutOfBoundsException(index + " >= "+ elementCount);
//其實,集合是可以裝填null元素的,所以這里需要區分,時間復雜度為O(n)
       if (o == null) {
           for (int i = index; i >= 0; i--)
               if (elementData[i]==null)
                   return i;
       } else {
           for (int i = index; i >= 0; i--)
               if (o.equals(elementData[i]))
                   return i;
       }
       return -1;
   }

感謝各位的閱讀,以上就是“如何實現Stack棧”的內容了,經過本文的學習后,相信大家對如何實現Stack棧這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

贵德县| 波密县| 常熟市| 蛟河市| 安化县| 隆昌县| 汝州市| 夏邑县| 宁阳县| 双辽市| 友谊县| 藁城市| 麻江县| 南昌市| 富平县| 贺州市| 闵行区| 宁南县| 嘉善县| 红河县| 和政县| 山阴县| 台州市| 辰溪县| 祥云县| 什邡市| 东乡| 锡林郭勒盟| 临武县| 沙湾县| 富锦市| 新兴县| 台山市| 凤凰县| 长乐市| 佳木斯市| 旌德县| 河曲县| 碌曲县| 长寿区| 治县。|