对栈的学习(前缀、中缀、后缀表达式)超详细!由计算器的实现哦

本文详细介绍了栈的概念、应用场景,特别是用栈实现综合计算器来处理中缀表达式。还探讨了前缀、中缀、后缀表达式,包括它们的计算机求值方法,以及如何将中缀表达式转化为后缀表达式。通过实例展示了逆波兰计算器的工作原理和代码实现。
摘要由CSDN通过智能技术生成

栈的概念

1)栈的英文为(stack)

2)栈是一个先入后出(FILO-First In Last Out)的有序列表。

3)栈(stack)是限制线 性表中元素的插入和删除只能在线性表的同一端进行的一种特殊线性表。允许插入和删除的一端,为变化的一端,称为栈顶(Top)另中一端为固定的一 端,称为栈底(Bottom)。

4)根据栈的走义可知,最先放入栈中元素在栈底,最后放入的元素在栈项,而删除元素刚好相反,最后放入的元素最先删除,最先放入的元素最后删除

栈的应用场景

1)子程序的调用:在跳往子程序前,会先将下个指令的地址存到堆栈中,直到子程序执行完后再将地址取出,以回到原来的程序中。

2)处理递归调用:和子程序的调用类似,只是除了储存下一个指令的地址外,也将参数、区域变量等数据存入堆栈中。

3)表达式的转换 [中缀表达式转后缀表达式]与求值(实际解决)。

  1. 二叉树的遍历。

5)图形的深度优先(depth一first)搜索法。

用数组模拟栈

在这里插入图片描述

代码实现

package com.zhao.stack;

public class ArrayStackDemo {
   

    public static void main(String[] args) {
   
        ArrayStack stack = new ArrayStack(50);
        for (int i=1;i<20;i++){
   
            stack.push(i);
        }

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

        stack.list();

    }
}

//定义一个ArrayStack 表示栈
class ArrayStack{
   
    private int maxSize; //栈的大小
    private int[] stack; //数组,数组模拟栈,数据就放在该数组
    private int top = -1;// top表示栈顶,初始化为-1

    //构造器

    public ArrayStack(int maxSize) {
   
        this.maxSize = maxSize;
        stack = new int[this.maxSize];
    }

    //栈满
    public boolean isFull(){
   
        return top == maxSize-1;
    }

    //栈空
    public boolean isEmpty(){
   
        return top == -1;
    }

    //入栈
    public void push(int value){
   
        if (isFull()){
   
            System.out.println("栈已经满了");
            return;
        }
        top++;
        stack[top] = value;
    }

    //出栈
    public int pop(){
   
        if (isEmpty()){
   
          new RuntimeException("栈空,没东西");
        }
        int value = stack[top];
        top--;
       return value;
    }

    //遍历栈
    public void list(){
   
        if (isEmpty()){
   
            System.out.println("空了,没东西");
            return;
        }
        for (int i=top;i>=0;i--){
   
            System.out.printf("stack[%d]=%d \n",i,stack[i]);
        }

    }
}

用栈实现综合计算器(中缀表达式)

图解思路

在这里插入图片描述

代码实现
package com.zhao.stack;

import javax.lang.model.element.NestingKind;

public class Calculator {
   
    public static void main(String[] args) {
   
        String expression = "80+2*6-2";

        ArrayStack2 numStack = new ArrayStack2(10);
        ArrayStack2 operStack = new ArrayStack2(10);
        //定义需要的相关变量
        int index = 0;//用于扫描
        int num1 = 0;
        int num2 = 0;
        int oper = 0 ;
        int res =0 ;
        char aChar = ' '; //将每次扫描得到char保存到ch
        String keepNum ="";//用于拼接多位数

        //开始扫描字符串
        while(true){
   
            //依次得到expression的每一个字符
            aChar = expression.substring(index,index+1).charAt(0);
            //判断aCher是什么
            if (operStack.isOper(aChar)) {
   //如果是运算符
                //判断当前的符号栈是否为空
                if (!operStack.isEmpty()) {
   
                    //如果符号栈有操作符,就进行比较,如果当前的操作符的优先级小于或者等于栈中的操作符,就需要从数栈中pop出两个数。
                    //在从符号栈中pop出一个符号,进行运算,将得到结果,入数栈,然后将当前的操作符入符号栈
                    if (operStack.priority(aChar) <= operStack.priority(operStack.peek())) {
   
                        num1 = numStack
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值