数据结构 栈和队列

来源:互联网 发布:淘宝ugg授权书怎么弄 编辑:程序博客网 时间:2024/05/20 07:51

概述

栈和队列都是通过动态集合来存储数据,在栈和队列中添加和删除数据都是预先设定的,在栈(Stack)中,被删除的元素是最近添加的元素,所以栈的实现方式是后进先出(Last-in, First-out);在队列中,被删除的元素是最开始添加的的元素,也就是在动态集合中存放时间最长的那个元素,所以队列的实现方式是先进先出(First-in,First-out)。

在栈的数据结构中,添加元素的操作被称之为入栈(PUSH),删除元素的操作被称之为出栈,也可以称为弹出(POP)。如果栈中不存在任何一个元素,那么这个栈被称为空栈。

这里写图片描述

栈的代码实现

package structdemo;/** * 栈 */public class Stack<E> {    /**     * 初始大小     */    private static final int DEFAULT_CAPACITY = 10;    private Object[] elementData;    public Stack() {        elementData = new Object[DEFAULT_CAPACITY];    }    private int size;    public int getSize() {        return size;    }    /**     * 判断元素是否为空     */    public boolean isEmpty() {        return size == 0 ? true : false;    }    /**     * 压入     *      * @param e     */    public void push(E e) {        ensureCapacity();        elementData[size] = e;        size++;    }    /**     * 数组扩容     */    private void ensureCapacity() {        int oldCapacity = elementData.length;        if (size == oldCapacity) {            int newCapacity = oldCapacity + (oldCapacity >> 1);            Object[] newTable = new Object[newCapacity];            System.arraycopy(elementData, 0, newTable, 0, size);            elementData = newTable;        }    }    /**     * 出栈     *      * @return     */    public E pop() {        if (size == 0) {            return null;        }        E e = (E) elementData[size - 1];        size--;        return e;    }}

队列

在队列中,添加元素的操作被称之为入队(enqueue),而删除元素的操作被称之为出队(dequeue)。在队列中,会有队头(head)和队尾(tail)。当一个元素入队时,该元素就被放入到队尾的位置,而出队的元素就是队头的元素。

这里写图片描述

队列的代码实现

package structdemo;/** * 队列 *  * @author zhangke * * @param <E> */public class Queue<E> {    /**     * 初始大小     */    private static final int DEFAULT_CAPACITY = 10;    private Object[] elementData;    /**     * 队头和队尾     */    private E head, tail;    public Queue() {        elementData = new Object[DEFAULT_CAPACITY];    }    private int size;    public int getSize() {        return size;    }    /**     * 判断元素是否为空     */    public boolean isEmpty() {        return size == 0 ? true : false;    }    /**     * 入队     *      * @param e     */    public void enqueue(E e) {        ensureCapacity();        elementData[size] = e;        size++;    }    /**     * 数组扩容     */    private void ensureCapacity() {        int oldCapacity = elementData.length;        if (size == oldCapacity) {            int newCapacity = oldCapacity + (oldCapacity >> 1);            Object[] newTable = new Object[newCapacity];            System.arraycopy(elementData, 0, newTable, 0, size);            elementData = newTable;        }    }    /**     * 弹出     *      * @return     */    public E dequeue() {        if (size == 0) {            return null;        }        E e = (E) elementData[0];        System.arraycopy(elementData, 1, elementData, 0, size - 1);        elementData[--size] = null;        return e;    }    /**     * 队头     *      * @return     */    public E getHead() {        if (size == 0) {            return null;        }        return (E) elementData[0];    }    /**     * 队尾     *      * @return     */    public E getTail() {        if (size == 0) {            return null;        }        return (E) elementData[size - 1];    }}
0 0