数据结构 - 基于数组的栈

栈Stack

*栈也是一种线性数据结构

*相比数组,栈对应的操作是数组的子集

*只能从一端添加元素,也只能从这一端取出元素

*这一端称为栈顶

*栈是一种后进先出的数据结构(Last in first out)

*在计算机的世界里,栈拥有着不可思议的作用

栈的应用:

  *无处不在的undo操作(撤销)

  *程序调用的系统栈(执行程序时,当一个子过程执行完成之后,可以自动回到上层调用中断的位置继续执行下去背后的原因就是有着一个系统栈来记录每一次调用过程中中断的位置)

  *...

基于数组实现的栈结构源码如下:

package stack;

public interface Stack<E> {
    
    public void push(E e);
    
    public E pop();
    
    public E peek();
    
    public int getSize();
    
    public boolean isEmpty();

}

package stack;

import array.Array;

/**
 * 基于数组的栈结构的实现
 *
 * @author zhangtianci
 *
 * @param <E>
 */
public class ArrayStack<E> implements Stack<E>{
    Array<E> array;        //基于数组的一个封装
    
    /**
     * 构造函数
     *
     * @param capacity
     * 栈的容量
     */
    public ArrayStack(int capacity){
        array = new Array<>(capacity);
    }
    
    /**
     * 无参构造函数,默认容量为10
     *
     */
    public ArrayStack(){
        array = new Array<>();
    }
    
    /**
     * 获取栈中元素的个数
     */
    @Override
    public int getSize(){
        return array.getSize();
    }
    
    /**
     * 查询栈是否为空,为空则返回ture,反之false
     */
    @Override
    public boolean isEmpty(){
        return array.isEmpty();
    }
    
    /**
     * 向栈中压入一个元素
     */
    @Override
    public void push(E e) {
        array.addLast(e);
        
    }
    
    /**
     * 弹出栈顶的元素
     */
    @Override
    public E pop() {
        return array.removeLast();
    }

    /**
     * 查询栈的容量
     *
     * @return
     */
    public int getCapacity(){
        return array.getCapacity();
    }
    
    /**
     * 看一眼栈顶的元素
     */
    @Override
    public E peek() {
        // TODO Auto-generated method stub
        return array.getLast();
    }
    
    @Override
    public String toString(){
        StringBuilder res = new StringBuilder();
        res.append(String.format("Capacity = %d, size = %d\n", getCapacity(),getSize()));
        res.append("Stack: ");
        res.append('[');
        for(int i = 0; i < array.getSize(); i++){
            res.append(i);
            if (i != array.getSize() - 1) {
                res.append(", ");
            }
            
        }
        res.append("] top");
        
        return res.toString();
    }
    
}

为什么getCapacity()方法没有在接口中定义,却在ArrayStack中定义?

因为只有在基于数组实现的栈才有capacity这个概念,所以此时应该在ArrayStack中定义这个方法。

基于数组的栈简单复杂度分析

  * void push(E e)  : O(1) 均摊

  *E pop(E e)  : O(1) 均摊

  *E peek() : O(1)

  *int getSize() : O(1)

  *boolean isEmpty() : O(1)

猜你喜欢

转载自www.cnblogs.com/tc971121/p/10010470.html
今日推荐