国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 編程 > Java > 正文

Java ArrayDeque實(shí)現(xiàn)Stack的功能

2019-11-26 14:28:11
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

在J2SE6引入了ArrayDeque類,它繼承了Deque(雙向隊(duì)列)接口,使用此類可以自己實(shí)現(xiàn)java.util.Stack類的功能,去掉了java.util.Stack的多線程同步的功能。

例如創(chuàng)建一個(gè)存放Integer類型的Stack,只要在類中創(chuàng)建一個(gè)ArrayDeque類的變量作為屬性,之后定義的出棧、入棧,觀察棧頂元素的操作就直接操作ArrayDeque的實(shí)例變量即可。 

import java.util.ArrayDeque; import java.util.Deque;  public class IntegerStack {   private Deque<Integer> data = new ArrayDeque<Integer>();    public void push(Integer element) {     data.addFirst(element);   }    public Integer pop() {     return data.removeFirst();   }    public Integer peek() {     return data.peekFirst();   }    public String toString() {     return data.toString();   }    public static void main(String[] args) {     IntegerStack stack = new IntegerStack();     for (int i = 0; i < 5; i++) {       stack.push(i);     }     System.out.println(stack);     System.out.println("After pushing 5 elements: " + stack);     int m = stack.pop();     System.out.println("Popped element = " + m);     System.out.println("After popping 1 element : " + stack);     int n = stack.peek();     System.out.println("Peeked element = " + n);     System.out.println("After peeking 1 element : " + stack);   } }  

java.util.ArrayDeque的源碼:    

private transient E[] elements;  private transient int head;  private transient int tail;  /*此處存放e的位置是從elements數(shù)組最后的位置開始存儲(chǔ)的*/  public void addFirst(E e) {     if (e == null)       throw new NullPointerException();     elements[head = (head - 1) & (elements.length - 1)] = e;//首次數(shù)組容量默認(rèn)為16,head=(0-1)&(16-1)=15     if (head == tail)       doubleCapacity();   }  /*每次擴(kuò)容都按插入的先后順序重新放入一個(gè)新的數(shù)組中,最新插入的放在數(shù)組的第一個(gè)位置。*/   private void doubleCapacity() {     assert head == tail;     int p = head;     int n = elements.length;     int r = n - p; // number of elements to the right of p     int newCapacity = n << 1;     if (newCapacity < 0)       throw new IllegalStateException("Sorry, deque too big");     Object[] a = new Object[newCapacity];     System.arraycopy(elements, p, a, 0, r);     System.arraycopy(elements, 0, a, r, p);     elements = (E[])a;     head = 0;     tail = n;   }    public E removeFirst() {     E x = pollFirst();     if (x == null)       throw new NoSuchElementException();     return x;   }    public E pollFirst() {     int h = head;     E result = elements[h]; // Element is null if deque empty     if (result == null)       return null;     elements[h] = null;   // 重新設(shè)置數(shù)組中的這個(gè)位置為null,方便垃圾回收。     head = (h + 1) & (elements.length - 1);//將head的值回退,相當(dāng)于將棧的指針又向下移動(dòng)一格。例如,12--〉13     return result;   }    public E peekFirst() {     return elements[head]; // elements[head] is null if deque empty   } 

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家學(xué)習(xí)java程序設(shè)計(jì)有所幫助。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 江山市| 南岸区| 扎囊县| 汉源县| 福海县| 盐边县| 泸溪县| 治县。| 蛟河市| 册亨县| 武邑县| 眉山市| 普安县| 临武县| 江陵县| 汉寿县| 普格县| 商丘市| 易门县| 义乌市| 灵石县| 景宁| 米易县| 澄迈县| 涿鹿县| 潜江市| 南京市| 柞水县| 项城市| 吴川市| 临桂县| 嘉禾县| 潜山县| 马尔康县| 开封市| 郸城县| 宁陕县| 鸡东县| 山丹县| 正宁县| 双柏县|