Java ArrayDeque实现Stack的功能
程序员文章站
2024-03-09 10:52:11
在j2se6引入了arraydeque类,它继承了deque(双向队列)接口,使用此类可以自己实现java.util.stack类的功能,去掉了java.util.stac...
在j2se6引入了arraydeque类,它继承了deque(双向队列)接口,使用此类可以自己实现java.util.stack类的功能,去掉了java.util.stack的多线程同步的功能。
例如创建一个存放integer类型的stack,只要在类中创建一个arraydeque类的变量作为属性,之后定义的出栈、入栈,观察栈顶元素的操作就直接操作arraydeque的实例变量即可。
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数组最后的位置开始存储的*/ public void addfirst(e e) { if (e == null) throw new nullpointerexception(); elements[head = (head - 1) & (elements.length - 1)] = e;//首次数组容量默认为16,head=(0-1)&(16-1)=15 if (head == tail) doublecapacity(); } /*每次扩容都按插入的先后顺序重新放入一个新的数组中,最新插入的放在数组的第一个位置。*/ 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; // 重新设置数组中的这个位置为null,方便垃圾回收。 head = (h + 1) & (elements.length - 1);//将head的值回退,相当于将栈的指针又向下移动一格。例如,12--〉13 return result; } public e peekfirst() { return elements[head]; // elements[head] is null if deque empty }
以上就是本文的全部内容,希望对大家学习java程序设计有所帮助。