Java实现栈

栈的概念

什么是栈

是一个先进后出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());
        }

    }
}

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值