数据结构 - 基于数组的栈

Posted tc971121

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构 - 基于数组的栈相关的知识,希望对你有一定的参考价值。

栈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 ", 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)

 
























































































































以上是关于数据结构 - 基于数组的栈的主要内容,如果未能解决你的问题,请参考以下文章

基于数组的栈(Java)

栈(基于数组&基于链表)与队列(基于数组&基于链表)

《学习JavaScript数据结构与算法》 第四章笔记 栈

用数组结构实现大小固定的栈和队列

数据结构之——基于链表的栈的模板实现

手把手5分钟掌握JavaScript栈数据结构JavaScript数据结构与算法系列