成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

如何實(shí)現(xiàn)Stack棧

這篇文章主要講解了“如何實(shí)現(xiàn)Stack?!?,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“如何實(shí)現(xiàn)Stack?!卑?!

創(chuàng)新互聯(lián)長期為數(shù)千家客戶提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊(duì)從業(yè)經(jīng)驗(yàn)10年,關(guān)注不同地域、不同群體,并針對不同對象提供差異化的產(chǎn)品和服務(wù);打造開放共贏平臺(tái),與合作伙伴共同營造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為遜克企業(yè)提供專業(yè)的做網(wǎng)站、成都做網(wǎng)站,遜克網(wǎng)站改版等技術(shù)服務(wù)。擁有十余年豐富建站經(jīng)驗(yàn)和眾多成功案例,為您定制開發(fā)。

一,Stack源碼分析

Stack,棧,也是數(shù)據(jù)結(jié)構(gòu)的一種,對于java應(yīng)用開發(fā)者而言,我使用棧的應(yīng)用場景比較少,一般做做算法類的題會(huì)用到,對于實(shí)際的應(yīng)用場景我覺得棧還是比較厲害的一種數(shù)據(jù)結(jié)構(gòu),棧的特點(diǎn)嘛,先進(jìn)后出,后進(jìn)先出。 

二,方法分析

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

Vector集合最全面的源碼分析 

2.1,棧結(jié)構(gòu)繼承結(jié)構(gòu)

//記住和理解java類的"單繼承,多實(shí)現(xiàn)"的特點(diǎn)哈
public class Stack<E> extends Vector<E> {}
   

2.2,構(gòu)造函數(shù)

//一個(gè)無參構(gòu)造函數(shù)
public Stack() {
   }
   

2.3,push()方法

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

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

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

2.4,pop()方法

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

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

2.5,peek()方法

public synchronized E peek() {
   //獲取集合元素個(gè)數(shù)
       int     len = size();
 //集合個(gè)數(shù)長度為0時(shí),再去獲取元素時(shí)就應(yīng)該拋出棧為空的異常
       if (len == 0)
           throw new EmptyStackException();
       return elementAt(len - 1);
   }
//第二步操作
public synchronized E elementAt(int index) {
   //校驗(yàn)索引是否越界
       if (index >= elementCount) {
           throw new ArrayIndexOutOfBoundsException(index + " >= " + elementCount);
       }
//根據(jù)索引下標(biāo)位置獲取指定位置的元素
       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) {
   //預(yù)檢查機(jī)制
       if (index >= elementCount)
           throw new IndexOutOfBoundsException(index + " >= "+ elementCount);
//其實(shí),集合是可以裝填null元素的,所以這里需要區(qū)分,時(shí)間復(fù)雜度為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;
   }

感謝各位的閱讀,以上就是“如何實(shí)現(xiàn)Stack棧”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對如何實(shí)現(xiàn)Stack棧這一問題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!

當(dāng)前文章:如何實(shí)現(xiàn)Stack棧
分享網(wǎng)址:http://jinyejixie.com/article14/igosge.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供關(guān)鍵詞優(yōu)化、品牌網(wǎng)站制作、網(wǎng)站排名域名注冊、做網(wǎng)站虛擬主機(jī)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都網(wǎng)站建設(shè)公司
鲁山县| 紫金县| 镶黄旗| 磐安县| 清苑县| 辛集市| 清苑县| 屯门区| 长寿区| 崇左市| 闽清县| 宁晋县| 宁南县| 潼关县| 永安市| 柳林县| 镇安县| 青冈县| 永登县| 文水县| 泸州市| 维西| 济源市| 江山市| 泾川县| 东港市| 固始县| 恩施市| 蕉岭县| 卫辉市| 竹溪县| 祁东县| 舞阳县| 高安市| 株洲县| 龙陵县| 贵港市| 朝阳县| 内丘县| 化州市| 丹东市|