`

ArrayDeque实现Stack的功能

阅读更多

在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
    }
 

 

 

2
4
分享到:
评论
1 楼 adam_zs 2013-03-25  
好,谢谢分享。

相关推荐

    Java ArrayDeque实现Stack的功能

    Java `ArrayDeque` 是一个高效且灵活的双端队列实现,它可以用来替代传统的 `Stack` 类来实现栈的功能。`ArrayDeque` 在 Java 6 中被引入,并且它实现了 `Deque` 接口,同时也实现了 `Queue` 接口的部分方法。与 `...

    Java数据结构实现之Stack.zip

    如果对性能有特殊需求,开发者还可以自定义栈的实现,例如使用ArrayList或LinkedList,并添加特定的方法来实现栈的功能。 总的来说,Java提供了多种方式来实现栈这一数据结构,每种实现都有其特点和适用场景。了解...

    安卓实现stack的回退和activitygroup的结合

    在Android应用开发中,"安卓实现stack的回退和activitygroup的结合"是一个常见的需求,尤其是在构建具有复杂导航结构的应用时。Stack(堆栈)是一种数据结构,它遵循后进先出(LIFO,Last In First Out)的原则,...

    java 栈的实现和应用

    总结来说,Java提供了多种方式来实现和使用栈,无论是简单的`ArrayDeque`还是传统的`Stack`类,都能满足不同场景下的需求。栈作为一种基础数据结构,其灵活性和效率使其在编程中扮演着至关重要的角色。通过熟练掌握...

    Java写的一个进栈出栈的演示程序

    本程序的"汪秋云 MyStack.java"很可能是一个自定义的栈实现,可能包含了`push`和`pop`等基本操作,以及一些额外的功能,例如检查栈是否为空、获取栈的大小等。代码中可能会使用数组或者链表作为底层数据结构,并通过...

    基于 Java 实现的队列和堆栈

    - **基本操作**:Java中,`java.util.Stack`类实现了堆栈功能,提供了`push()`(压栈)、`pop()`(出栈)、`peek()`(查看顶部元素)等方法。 - **实现方式**:堆栈通常用数组或链表实现。Java的`Stack`类底层是...

    Stack

    Java提供了一个内置的`java.util.Stack`类来实现栈的功能。 栈的基本操作包括: 1. **压栈(push)**:将一个元素添加到栈顶。 2. **弹栈(pop)**:移除并返回栈顶的元素。如果栈为空,则抛出`EmptyStackException...

    用LinkedList实现队列和栈

    在Java编程语言中,`LinkedList` 是一个常用的集合类,它实现了`List`接口,并且提供了额外的功能,如双端操作。本篇文章将探讨如何利用`LinkedList`来实现队列和栈这两种数据结构,以及其背后的原理和源码分析。 #...

    Java集合Stack源码详解

    2. **继承自Vector**:Stack不是独立实现的,而是基于Vector,因此它具备了Vector的所有功能,包括扩容、线程安全等特性。 3. **数据结构**:虽然Stack的数据结构基于数组,但是与ArrayList不同,Stack的push和pop...

    JAVA数据结构实验报告

    1. 栈:后进先出(LIFO)的数据结构,Java中可以使用ArrayDeque或Stack类实现。 2. 队列:先进先出(FIFO)的数据结构,Java提供了LinkedList或ArrayBlockingQueue等实现。 3. 堆:可以理解为部分有序的树形数据结构...

    Java中Vector类和Stack类的学习

    对于栈的需求,`Deque`接口(尤其是`ArrayDeque`)提供了更高效且功能丰富的实现。 总之,虽然`Vector`和`Stack`在Java早期版本中广泛使用,但在现代Java编程中,考虑到性能和设计模式的改进,开发者通常会选择更...

    Java数据结构与算法之栈(Stack)实现详解

    在Java中,我们可以使用Java Collections Framework提供的Stack类,它实现了上述的栈接口,但需要注意的是,Java的Vector类在实现Stack类时并没有遵循栈的先进后出原则,而是基于数组的动态数组实现,所以它实际上是...

    用java实现数据结构,形成文档以及代码.zip

    队列是一种先进先出(FIFO)的数据结构,Java的LinkedList或ArrayDeque类也可实现队列功能。 7. **树**: 树是一种分层数据结构,其中每个节点可能有零个或多个子节点。二叉树是最常见的类型,每个节点最多有两个...

    数据结构java代码实现

    在压缩包中的“数据结构代码java实现”可能包含了以上所有数据结构的Java源代码,每一种数据结构都会有一个独立的类,类中会有对应的方法来实现数据结构的功能。初学者可以通过阅读和运行这些代码,加深对数据结构的...

    java实现数据结构

    Java中的`LinkedList`类实现了`List`接口,提供了双向链表的功能。你可以通过`add()`方法在链表的末尾添加元素,`addFirst()`和`addLast()`分别用于在开头和末尾添加,`get()`用于获取指定位置的元素,而`remove()`...

    数据结构 实现 源代码

    比如,`ArrayList`和`LinkedList`对应数组和链表,`Stack`和`Queue`接口及其实现类如`ArrayDeque`提供了栈和队列功能,`HashMap`和`HashSet`实现了哈希表和无序集合,`TreeMap`和`TreeSet`则基于红黑树实现有序映射...

    stack_queue_p2pchat_practice:只是使用Stack和Queue技术的Java实践聊天应用程序

    在P2P聊天应用的设计中,我们可以使用Stack来实现消息历史的浏览功能,用户可以通过不断地pop操作回溯聊天记录。同时,Queue可以用于实现消息的发送队列,新接收到的消息会被enqueue,然后在合适的时候被dequeued并...

    java实现关于字符串的符号匹配帮助类

    Deque&lt;Character&gt; stack = new ArrayDeque(); for (int i = 0; i (); i++) { if (pattern.contains(input.charAt(i))) { stack.push(input.charAt(i)); } else if (!stack.isEmpty() && isPair(stack.peek(), ...

    Java数据结构PPT.rar

    Java的ArrayDeque或Stack类可以实现栈。 4. **队列**:队列是一种先进先出(FIFO)的数据结构,通常有入队(enqueue)和出队(dequeue)两个操作。Java的Queue接口和LinkedList可以用来实现队列。 5. **堆**:堆是...

    JAVA基本5种数据结构的实现。

    Java的`java.util.Deque`接口提供了此类功能,常见的实现有`ArrayDeque`。 最后,堆是一种特殊的树形数据结构,通常用于优先队列,其中每个父节点的值都小于或等于其子节点。虽然这里没有明确的堆实现文件,但Java...

Global site tag (gtag.js) - Google Analytics