新星计划-[手撕数据结构]栈的深入学习-JAVA实现

CSDN的各位友友们你们好,今天千泽为大家带来的是
栈的深入学习,
接下来让我们一起开始手撕数据结构吧!
如果对您有帮助的话希望能够得到您的支持和关注,我会持续更新的!

一、栈的定义

1. 栈的概念

栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈

顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。

2. 栈的图解

压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶。

出栈:栈的删除操作叫做出栈。出数据在栈顶。

可以看出,入栈和出栈会改变栈顶.

3.栈的几种主要基本操作:

void push(int data):入栈(将数据data插入到栈中)

int pop():出栈(删除并返回最后一个插入栈的元素)

int top():返回最后一个插入栈的元素,但不删除

int size():返回存储在栈中的元素个数

boolean isEmpty():返回栈是否是空栈

boolean isFull():返回是否是满栈

void Clear():清除整个栈

二、栈的模拟实现

Java集合中的Stack类在底层是一个顺序表 , 那么我们可以简单的用一个数组来模拟栈

import java.util.Arrays;

public class MyStack {
   public int [] elem;
   public int usedSize;

    public MyStack() {
        this.elem = new int [5];
    }

    public void push(int val){

        if(isFull()){
           this.elem =  Arrays.copyOf(this.elem,2*this.elem.length);
        }
        this.elem[this.usedSize] = val;
        this.usedSize++;
    }

    public boolean isFull(){
        return this.usedSize == elem.length;
    }

    public int pop(){
        if(isEmpty()){
            throw  new RuntimeException("栈为空!");
        }
        int OldValue = this.elem[usedSize - 1];
        this.usedSize--;
        return OldValue;
    }

    public int peek(){
        if(isEmpty()){
            throw  new RuntimeException("栈为空!");
        }
        return this.elem[usedSize - 1];
    }


    public boolean isEmpty(){
        return this.usedSize == 0;
    }
}

友友们可以动手实践一下,数据结构一定要多写多画图多总结!

三.栈的经典使用场景-逆波兰表达式

现在,我们了解了栈的相关代码写法, 那么我们一起来看一下栈在题目中的应用

150. 逆波兰表达式求值

https://leetcode.cn/problems/evaluate-reverse-polish-notation/

解法



public class 逆波兰 {
    int i = 0 ;
    public int evalRPN(String[] tokens) {
        Stack<Integer> stack = new Stack<>();
       for(int i = 0; i < tokens.length; i++){
           String val = tokens[i];
           if(isOperation(val) == false){
               stack.push(Integer.parseInt(val));
           }else {
               int num1 = 0;
               int num2 = 0;
               switch (val){
                   case "+":
                       num2 = stack.pop();
                       num1 = stack.pop();
                       stack.push(num1 + num2);
                       break;
                   case "-":
                       num2 = stack.pop();
                       num1 = stack.pop();
                       stack.push(num1 - num2);
                       break;
                   case "*":
                       num2 = stack.pop();
                       num1 = stack.pop();
                       stack.push(num1 * num2);
                       break;
                   case "/":
                       num2 = stack.pop();
                       num1 = stack.pop();
                       stack.push(num1 / num2);
                       break;
               }
           }
       }
       return stack.pop();
    }
    public  boolean isOperation(String str){
        if(str.equals("+") || str.equals("-") || str.equals("*") || str.equals("/")){
            return true;
        }
        return false;
    }
}

四.栈的其他常见应用实例

  • 符号匹配

  • HTML和XML文件中的标签匹配(实质还是符号匹配)

  • 实现函数调用

  • 文本编辑器中的撤销

  • 网页浏览器中已访问页面的历史记录

  • 作为一个算法的辅助数据结构

随堂小练习:

进制转换,由十进制转化为八进制或二进制

首先熟悉进制转换的步骤,可以网上查询。比如十进制转换为八进制(1087)10

1.1087除以8得135余7

2.135除以8得16余7

3.16除以8得2余0

4.2除以8得0余2

因此转化为八进制为(2077)8以上得出来的是从后到前的结果,可以实例到栈类型中,利用栈的抽象模型,将先算出来的余数放入栈中,算完后,再从栈顶中取出,结果正好是计算的结果,满足先进后出的原则,可以画图理解一下,

思路:

首先定义一个栈,计算得出的余数入栈,然后再出栈,得出来的数就是结果

首先定义一个栈

然后定义一个入栈的实例化函数,

小伙伴们来动手实现一下吧!

总结

今天栈的相关内容就到这里,祝你学习进步,感谢你的支持!

  • 5
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

千泽.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值