Loading

5.1 栈Stack基于动态数组的Java实现

1.什么是栈?

栈是一个有序的线性表,只能在栈顶进行操作插入和删除操作。所以也叫先进后出表。

2.栈的应用场景

  • 符号匹配
  • 中缀表达式转换为后缀表达式
  • 计算后缀表达式
  • 实现函数调用
  • 求范围误差
  • 网页浏览器中已访问页面的历史纪录
  • 文本编辑器中的撤销序列
  • 作为算法辅助数据结构(二叉树的非递归遍历)

3.栈的具体实现

3.1 基于简单数组的实现

顾名思义,就是用数组实现栈的应用

性能表:

操作 时间复杂度 空间复杂度
push() O(1) O(n)
pop() O(1) O(1)
size() O(1) O(1)
isEmpty() O(1) O(1)
isFull() O(1) O(1)
deleteStack() O(1) O(1)

3.2 动态数组的实现

它其实就是在简单数组基础上实现重复倍增来实现的:
以上面的简单数组实现为基础,增加一个倍增方法:

    /**
     * 栈空间扩增方法
     */
    private void doubleStack() {
   
        int[] newArray = new int[capacity*2];
        System.arraycopy(array,0,newArray,0,capacity);
        capacity = capacity*2;
        array = newArray;
    }

性能表:

操作 时间复杂度 空间复杂度
push() O(1) O(n)
pop() O(1) O(1)
size() O(1) O(1)
isEmpty() O(1) O(1)
isFull() O(1) O(1)
deleteStack() O(1) O(1)

3.3 链表的实现

使用链表实现栈,通过在链表的表头插入元素的方式实现push,删除链表的表头节点实现pop.
但,使用它还需要实现节点的构造,相比数组麻烦些,而且链表不太符合栈的顺序特性,

且它的性能表如下:

操作 时间复杂度 空间复杂度
push() O(1) O(n)
pop() O(1) O(1)
size() O(1) O(1)
isEmpty() O(1) O(1)
isFull() O(1) O(1)
deleteStack() O(n) O(1)

相比之下它的deleteStack复杂度比动态数组大。所以推荐使用动态数组实现栈。<

posted @ 2023-03-30 10:34  文牧之  阅读(27)  评论(0)    收藏  举报  来源