基于java的数据结构学习——数组实现的栈以及简单应用

栈 Stack

  • 栈是一种线性结构
  • 相比数组,栈对应的操作是数组的子集
  • 只能从一端添加元素,也只能从一端取出元素
  • 这一端称为栈顶
  • 栈是一种后进先出的数据结构

栈的应用

  • 无处不在的Undo操作(撤销)
  • 括号匹配(编译器)
  • 程序调用的系统栈

funA(){

1  ...

2  B()

3  ...

}

funB(){

1  ...

2  C()

3  ...

}

funC(){

1  ...

2  ...

3  ...

}

栈的实现及复杂度分析

Stack<E>                                         <---implement---    ArrayStack<E>

  • void push(E)                                 O(1) 均摊
  • E pop()                                         O(1) 均摊
  • E peek()                                       O(1)
  • int getSize()                                  O(1)
  • boolean isEmpty()                        O(1)

实现源码:

public class ArrayStack<E> implements Stack<E>{

    private Array<E> array;

    // 有参构造
    public ArrayStack(int capacity)
    {
        array = new Array<>(capacity);
    }

    // 默认构造
    public ArrayStack()
    {
        this(10);
    }

    // 判断栈是否为空
    @Override
    public boolean isEmpty()
    {
        return array.isEmpty();
    }

    // 判断栈是否已满
    public boolean isFull()
    {
        return array.isFull();
    }

    // 获取栈的容量
    @Override
    public int getCapacity()
    {
        return array.getCapacity();
    }

    // 获取栈内元素个数
    @Override
    public int getSize()
    {
        return array.getSize();
    }

    // 查看栈顶元素
    @Override
    public E peek()
    {
        return array.getLast();
    }

    // 栈顶元素出栈
    @Override
    public E pop()
    {
        return array.removeLast();
    }

    // 入栈
    @Override
    public void push(E e)
    {
        array.addLast(e);
    }

    @Override
    public String toString(){
        StringBuilder res = new StringBuilder();
        res.append(String.format("Stack Size = %d, Capacity = %d\n", array.getSize(), array.getCapacity()));
        res.append("Stack [");
        for (int i = 0; i < array.getSize(); i++) {
            res.append(array.get(i));
            if (i != array.getSize() - 1)
                res.append(", ");
        }
        res.append("] top");
        return res.toString();
    }

    public static void main(String[] args){
        ArrayStack<Integer> stack = new ArrayStack<>();
        for (int i = 0; i < 10; ++i) {
            stack.push(i);
            System.out.println(stack);
            if (i % 3 == 2) {
                stack.pop();
                System.out.println(stack);
            }
        }
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值