Loading

通过动态数组实现栈

栈是一种只能在表头进行插入和删除,即先进后出的线性结构。在Java中有定义好的Stack类,位于java.util包下。下面介绍两种自定义栈结构的方式。

public class DynArrayStack<T> {
    /**
     * 通过动态数组来实现栈
     * 1、capacity为数组容量
     * 2、定义数组初始容量为10,当栈满后数组容量变为原数组的1.5倍
     */
    private int top = -1;  // 栈顶所在位置
    private int capacity = 10;
    private Object[] arr = new Object[capacity];

    public boolean isEmpty(){ //判断栈是否为空
        return top == -1;
    }

    public void push(T data){ //将元素压入栈
        if(top == capacity - 1){ // 当栈满时,数组扩容
            capacity += capacity/2;  // 容量变为原来的1.5倍
            Object[] newarr = new Object[capacity];
            System.arraycopy(arr, 0, newarr, 0, arr.length); // 将arr中的元素复制到newarr
            arr = newarr;
        }
        arr[++top] = data;
    }

    @SuppressWarnings("unchecked")
    public T pop(){ //栈顶元素出栈
        if(isEmpty())
            throw new ArrayIndexOutOfBoundsException();  // 如果栈为空,抛出异常
        return (T)arr[top--];
    }

    @SuppressWarnings("unchecked")
    public T getTop(){ // 获取栈顶元素,不用出栈
        if(isEmpty())
            throw new ArrayIndexOutOfBoundsException();
        return (T)arr[top];
    }

    public void clear(){ // 清空栈
        top = -1;
    }

    public int size(){ // 返回栈中元素个数
        return top+1;
    }

}

通过链表实现

import java.util.EmptyStackException;

import linkedlist.ListNode;

public class LLStack<T> {
    /**
     * 通过链表实现栈
     * 1、通过在链表表头不断插入的方式实现push操作
     * 2、删除表头结点实现pop操作
     */
    private ListNode<T> headNode = new ListNode<T>(null);
    private int size = 0; // 栈中元素个数

    public void push(T data){ // 入栈
        if(headNode == null){//头结点不存在,即栈为空时
            headNode = new ListNode<T>(data);
        } else if(headNode.getData() == null){ //头结点数据为null,即第一次向栈中加元素
            headNode.setData(data); 
        } else {
            ListNode<T> node = new ListNode<T>(data);
            node.setNext(headNode);
            headNode = node;
        }
        size++;
    }

    public T getTop(){ // 获取栈顶元素
        if(headNode == null)
            throw new EmptyStackException();
        else
            return headNode.getData();
    }

    public T pop(){ // 出栈
        if(headNode == null){
            throw new EmptyStackException();
        } else {
            T data = headNode.getData();
            headNode = headNode.getNext();
            size--;
            return data;
        }
    }

    public boolean isEmpty(){ // 判断栈是否为空
        if(headNode == null) // 表头结点不存在
            return true;
        else if(headNode.getData() == null) //表头结点数据域为null
            return true;
        else
            return false;
    }

    public int size(){ // 返回栈中元素个数
        return size;
    }

}
posted @ 2017-03-31 12:48  leon_x  阅读(31)  评论(0)    收藏  举报