在路上

 找回密码
 立即注册
在路上 站点首页 学习 查看内容

Java ArrayDeque实现Stack的功能

2016-8-29 13:20| 发布者: zhangjf| 查看: 706| 评论: 0

摘要: 在J2SE6引入了ArrayDeque类,它继承了Deque(双向队列)接口,使用此类可以自己实现java.util.Stack类的功能,去掉了java.util.Stack的多线程同步的功能。 例如创建一个存放Integer类型的Stack,只要在类中创建一个Ar ...

在J2SE6引入了ArrayDeque类,它继承了Deque(双向队列)接口,使用此类可以自己实现java.util.Stack类的功能,去掉了java.util.Stack的多线程同步的功能。

例如创建一个存放Integer类型的Stack,只要在类中创建一个ArrayDeque类的变量作为属性,之后定义的出栈、入栈,观察栈顶元素的操作就直接操作ArrayDeque的实例变量即可。

  1. import java.util.ArrayDeque;
  2. import java.util.Deque;
  3. public class IntegerStack {
  4. private Deque<Integer> data = new ArrayDeque<Integer>();
  5. public void push(Integer element) {
  6. data.addFirst(element);
  7. }
  8. public Integer pop() {
  9. return data.removeFirst();
  10. }
  11. public Integer peek() {
  12. return data.peekFirst();
  13. }
  14. public String toString() {
  15. return data.toString();
  16. }
  17. public static void main(String[] args) {
  18. IntegerStack stack = new IntegerStack();
  19. for (int i = 0; i < 5; i++) {
  20. stack.push(i);
  21. }
  22. System.out.println(stack);
  23. System.out.println("After pushing 5 elements: " + stack);
  24. int m = stack.pop();
  25. System.out.println("Popped element = " + m);
  26. System.out.println("After popping 1 element : " + stack);
  27. int n = stack.peek();
  28. System.out.println("Peeked element = " + n);
  29. System.out.println("After peeking 1 element : " + stack);
  30. }
  31. }
复制代码

java.util.ArrayDeque的源码:

  1. private transient E[] elements;
  2. private transient int head;
  3. private transient int tail;
  4. /*此处存放e的位置是从elements数组最后的位置开始存储的*/
  5. public void addFirst(E e) {
  6. if (e == null)
  7. throw new NullPointerException();
  8. elements[head = (head - 1) & (elements.length - 1)] = e;//首次数组容量默认为16,head=(0-1)&(16-1)=15
  9. if (head == tail)
  10. doubleCapacity();
  11. }
  12. /*每次扩容都按插入的先后顺序重新放入一个新的数组中,最新插入的放在数组的第一个位置。*/
  13. private void doubleCapacity() {
  14. assert head == tail;
  15. int p = head;
  16. int n = elements.length;
  17. int r = n - p; // number of elements to the right of p
  18. int newCapacity = n << 1;
  19. if (newCapacity < 0)
  20. throw new IllegalStateException("Sorry, deque too big");
  21. Object[] a = new Object[newCapacity];
  22. System.arraycopy(elements, p, a, 0, r);
  23. System.arraycopy(elements, 0, a, r, p);
  24. elements = (E[])a;
  25. head = 0;
  26. tail = n;
  27. }
  28. public E removeFirst() {
  29. E x = pollFirst();
  30. if (x == null)
  31. throw new NoSuchElementException();
  32. return x;
  33. }
  34. public E pollFirst() {
  35. int h = head;
  36. E result = elements[h]; // Element is null if deque empty
  37. if (result == null)
  38. return null;
  39. elements[h] = null; // 重新设置数组中的这个位置为null,方便垃圾回收。
  40. head = (h + 1) & (elements.length - 1);//将head的值回退,相当于将栈的指针又向下移动一格。例如,12--〉13
  41. return result;
  42. }
  43. public E peekFirst() {
  44. return elements[head]; // elements[head] is null if deque empty
  45. }
复制代码

以上就是本文的全部内容,希望对大家学习java程序设计有所帮助。

最新评论

小黑屋|在路上 ( 蜀ICP备15035742号-1 

;

GMT+8, 2025-7-7 01:16

Copyright 2015-2025 djqfx

返回顶部