这里写目录标题

  • 栈的概念
  • 什么是栈
  • 举个栗子
  • 栈在应用中的作用
  • 具体实现
  • 栈接口
  • 栈具体实现
  • 栈测试


栈的概念

什么是栈

是一个先进后出First In Last out)的数据结构,出栈(从栈中取出元素)入栈(往栈中存入元素)只能在栈顶进行。

举个栗子

看了上述的表述是不是云里雾里的,没事我举个例子你就明白了。大家都打过羽毛球吧,装羽毛球的圆筒就能看作是一个栈,它首尾由一个开口封闭的底部组成。

我们打完羽毛球,将羽毛球收进筒的时候,只能从开口处放入羽毛球,取羽毛球的时候,也只能从开口处去拿的羽毛球。而且我们很容易发现先放进去的羽毛球往往是最后取出来的

在栈中这样取羽毛球的操作,我们称之为出栈放进去羽毛球的操作,我们称之为入栈。而“开口处”,我们称之为栈顶,因为出栈入栈的操作都在这里进行,与之相对的“封闭的底部”,无法从底部取出或者放入元素,我们称之为栈底

栈在应用中的作用

比如在JVM中的Java虚拟中的栈帧,又或者是Java中的语法检查,以及编译器中的语法分析器等等。

具体实现

栈接口

/**
 * title
 * description
 *
 * @author 三文鱼
 * @date2022/3/14
 **/
public interface IStack {
    //置空
    public void clear();
    //判空
    public boolean isEmpty();
    //返回栈中元素个数
    public int length();
    //读取栈顶元素
    public Object peek();
    //入栈
    public void push(Object o) throws Exception;
    //返回栈顶元素 出栈
    public Object pop();
}

栈具体实现

/**
 * title
 * description
 *
 * @author 三文鱼
 * @date2022/3/14
 **/
public class SqStack implements IStack{
    //对象数组实现栈
    public Object[] stackElem;
    //指向下一存储位置 为0时表示为空
    public int top = 0;

    public SqStack(int maxSize) {
        stackElem = new Object[maxSize];
    }


    @Override
    public void clear() {
        top = 0;
    }

    @Override
    public boolean isEmpty() {
        return top == 0;
    }

    @Override
    public int length() {
        //top指向下一存储位置 即指向的是当前  下标+1 = 当前表长
        return top;
    }

    //读取栈顶元素
    @Override
    public Object peek() {
        if(top != 0)
            return stackElem[top - 1];
        else
            return null;
    }

    //入栈
    @Override
    public void push(Object o) throws Exception {
        if(top == stackElem.length)
            throw new Exception("栈已满。");
        else
            stackElem[top++] = o;
    }

    //出栈
    @Override
    public Object pop() {
        if(isEmpty())
            return null;
        else {
            top = top - 1;
            return stackElem[top];
        }

    }
}

栈测试

/**
 * title
 * description
 *
 * @author 三文鱼
 * @date2022/3/14
 **/
public class StackTest {
    public static void main(String[] args) throws Exception {
        SqStack sqStack = new SqStack(5);
        sqStack.push("零");
        sqStack.push("一");
        sqStack.push("二");
        sqStack.push("三");

        System.out.println("==========================");
        System.out.println("peek()测试,返回栈顶元素");
        System.out.println("栈顶元素为: " + sqStack.peek());

        System.out.println("==========================");
        System.out.println("出栈测试,返回栈顶元素");
        System.out.println("pop()出栈元素为: " + sqStack.pop() + " 出栈后栈顶元素为:" + sqStack.peek());

        System.out.println("==========================");
        System.out.println("入栈测试,返回栈顶元素");
        sqStack.push("三");
        System.out.println("入栈后栈顶元素为: " + sqStack.peek());

        System.out.println("==========================");
        System.out.println("length()测试,返回栈顶元素");
        System.out.println("当前栈长度为: " + sqStack.length());

        System.out.println("==========================");
        System.out.println("栈满测试,存入元素四。");
        sqStack.push("四");
        System.out.println("当前栈顶元素为: " + sqStack.peek() + " 栈的长度为: " + sqStack.length());
        System.out.println("尝试往已满栈中放入元素。");
        try {
            sqStack.push("五");
        }
        catch (Exception e){
            System.out.println(e.toString());
        }

        System.out.println("==========================");
        System.out.println("判空测试");
        if(!sqStack.isEmpty()) {
            System.out.println("栈不为空。栈顶元素为:" + sqStack.peek());
        }
        System.out.println("置空测试.");
        sqStack.clear();
        if(sqStack.isEmpty()) {
            System.out.println("栈为空。栈顶元素为:" + sqStack.peek());
            System.out.println("入栈元素wu." );
            sqStack.push("wu");
            System.out.println("栈顶元素为:" + sqStack.peek());
        }

    }
}