03-栈 Stack

学习资源:慕课网liyubobobo老师的《玩儿转数据结构》


1、简介

  • 栈也是一种线性结构
  • 栈对应的操作是数组的子集,它只能从一端添加元素,也只能从一端取出元素
  • 添加和取出元素的这一端称为栈顶
image-20200425142953515
  • 栈是一种后进先出Last In First Out (LIFO)的数据结构
  • 对于外界而言,只有栈顶的元素是暴露的
  • 在计算机的世界里,栈拥有着不可思议的作用

2、栈的应用

  • Undo操作(撤销),一般的编辑器都有撤销功能
image-20200425143321982
  • 程序调用的系统栈
image-20200425143606211
  • 括号匹配:编译器在括号匹配不成功时会报错

3、栈的实现

底层有多种实现方式,只要可以满足栈的定义和接口

3.1、栈的接口

public interface Stack<E> {

    int getSize();
    boolean isEmpty();
    void push(E e);	//入栈
    T pop();		//弹栈
    T peek();		//查看栈顶元素
}

3.2、基于动态数组的栈

  • 实现简单:只需内部封装一个动态数组,复用动态数组的方法实现栈的接口即可
  • 容量动态化
  • 支持泛型
package stack;

import array.Array;

//基于动态数组的栈实现
public class ArrayStack<T> implements Stack<T> {

    Array<T> array;

    public ArrayStack(int capacity) {
        array = new Array<>(capacity);
    }

    public ArrayStack() {
        array = new Array<>();
    }

    @Override
    public int getSize() {
        return array.getSize();
    }

    @Override
    public boolean isEmpty() {
        return array.isFull();
    }

    public int getCapacity(){
        return array.getCapacity();
    }

    @Override
    public void push(T t) {
        array.insertToLast(t);
    }

    @Override
    public T pop() {
        return array.removeLast();
    }

    @Override
    public T peek() {
        return array.getLast();
    }

    @Override
    public String toString() {

        StringBuilder stringBuilder = new StringBuilder();
        stringBuilder.append("Stack:[");
        for(int i=0; i<array.getSize(); i++){
            stringBuilder.append(array.getElement(i));
            if(i!=array.getSize()-1){
                stringBuilder.append(", ");
            }
        }
        stringBuilder.append("] top");
        return stringBuilder.toString();
    }
}

3.3、测试

public class Test {

    public static void main(String[] args) {

        ArrayStack<Integer> stack = new ArrayStack<>();

        System.out.println("栈容量为:"+stack.getCapacity());
        System.out.println("当前栈是否为空:"+stack.isEmpty());

        stack.push(10);
        stack.push(20);
        stack.push(30);
        stack.push(40);
        stack.push(50);
        
        System.out.println(stack);
        System.out.println("当前栈是否为空:"+stack.isEmpty());
        System.out.println("当前栈的大小为:"+stack.getSize());
        System.out.println("栈顶元素为:"+stack.peek());;
        

        stack.pop();
        stack.pop();

        System.out.println("弹栈后的栈为:"+stack);
    }
}

4、Java中的栈

java.util.Stack,继承了Vector(也是一个动态数组,与ArrayList不同)

public
class Stack<E> extends Vector<E> {
    
}

API接口

image-20200605183436014
原文地址:https://www.cnblogs.com/sout-ch233/p/13051409.html