栈实现计算机复杂计算

2023-11-10

package com.yg.stack;/*
@author  GeQiLin
@date    2020/2/22  14:14
*/

import jdk.nashorn.internal.ir.ReturnNode;

public class Calculator {
    /*
     * 1.index遍历表达式,一次取出一个字符存入ch中
     * 2.若ch是数字放入numStack中,当operStack为空时,如果ch是操作符则存入operStack中
     * 3.如果operStack不为空时,当前ch的优先级小于等于operStack【top】则在numStack中取出两个
     * 操作数和operStack中取出一个操作符,当ch的优先级大于operStack【top】
     * 则将ch存入operStack中
     *
     * */
    public static void main(String[] args) {
        String expersion = "300-5*6-20";
        int index = 0;//用于遍历expersion
        char ch = ' ';//用于记录字符串expersion第index位置的字符
        //两个操作数,和一个操作符oper,一个接受计算结果的res
        int num1 = 0;
        int num2 = 0;
        int oper = 0;
        int res = 0;
        String keepNum = "";//用于进行多位数运算时将ch进行拼接
        ArrayStack2 numStack = new ArrayStack2(10);//存放操作数
        ArrayStack2 operStack = new ArrayStack2(10);//存放操作符
        //循环取出expersion
        while (true) {
            ch = expersion.substring(index, index + 1).charAt(0);
            //ch是否是操作符
            if (operStack.isOper(ch)) {

                if (!operStack.isEmpty()) {
                    if (operStack.getPriority(ch) <= operStack.getPriority(operStack.getStackTop())) {
                        num1 = numStack.pop();
                        num2 = numStack.pop();
                        oper = operStack.pop();
                        res = numStack.doCalculator(num1, num2, oper);
                        numStack.push(res);
                        operStack.push(ch);

                    } else {
                        //ch优先级小于等于operStack栈顶的优先级直接入栈
                        operStack.push(ch);
                    }
                } else {
                    //operStack为空直接入栈
                    operStack.push(ch);
                }
            } else {
            /*    是操作数,要判段是不是多为数,也就是字符串expersion的index+1处
            是不是任是操作数,如果是字符直接进栈
            * */
                keepNum += ch;
                if (index == expersion.length() - 1) {
                    numStack.push(Integer.parseInt(keepNum));
                } else {


                    if (operStack.isOper(expersion.substring(index + 1, index + 2).charAt(0))) {
                        numStack.push(Integer.parseInt(keepNum));
                        keepNum = "";
                    }
                }
            }
            index++;
            if (index >= expersion.length()) {
                break;
            }
        }
        while (true) {
            if (operStack.isEmpty()) {
                break;
            }
            num1 = numStack.pop();
            num2 = numStack.pop();
            oper = operStack.pop();
            //如果operStack中连续两个操作符是-或者/要变成对应的+和*


            if (!operStack.isEmpty() && oper == operStack.getStackTop() && oper == '-') {
                oper = '+';
            }
            res = numStack.doCalculator(num1, num2, oper);
            numStack.push(res);
        }
        System.out.println(expersion + "=" + numStack.getStackTop());
    }
}

class ArrayStack2 {
    private int maxSize;//栈的大小
    private int[] stack;//用数组模拟栈存放数据
    private int top = -1;//栈的标识

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

    //判断栈是否为空
    public boolean isEmpty() {
        return top == -1;
    }

    //判断栈是否为满
    public boolean isFull() {
        return top == maxSize - 1;
    }

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

    //出栈
    public int pop() {
        if (isEmpty()) {
            throw 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("\t" + stack[i]);
        }
    }

    //判断当前字符是否为操作数
    public boolean isOper(char c) {
        return c == '+' || c == '-' || c == '*' || c == '/';
    }

    //查看当前栈顶元素
    public int getStackTop() {
        if (isEmpty()) {
            System.out.println("栈空");
            return 0;
        }
        return stack[top];
    }

    //执行计算操作
    public int doCalculator(int num1, int num2, int oper) {
        int value = 0;
        switch (oper) {
            case '+':
                value = num1 + num2;
                break;

            case '-':
                value = num2 - num1;
                break;
            case '*':
                value = num1 * num2;
                break;
            case '/':
                if (num1 == 0) {
                    throw new RuntimeException("被除数不能为0");
                }
                value = num2 / num1;
                break;
            default:
                System.out.println("参数有误");
                break;
        }
        return value;
    }

    //得到操作符的优先级
    public int getPriority(int ch) {
        if (ch == '+' || ch == '-') {
            return 0;
        } else if (ch == '*' || ch == '/') {
            return 1;
        } else {
            return 0;
        }


    }
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

栈实现计算机复杂计算 的相关文章

随机推荐

  • js实现前端分页页码管理

    用JS实现前端分页页码管理 可以很美观的区分页码显示 这也是参考大多数网站的分页页码展示 能够有很好的用户体验 这也是有业务需要就写了一下 还是新手 经验不足 欢迎指出批评 首先先看效果图 这是初始页面 也就是第一页 的界面 如果为第一页时
  • Python怎么合并两个矩阵?Python矩阵合并需要使用什么方法

    python之中的第三方库numpy可以构建出来矩阵这种行列格式且对称的数据结构 而在之前的文章之中小编给大家介绍了矩阵是如何通过添加的方式来扩展行列的 而本次要来给大家分享的就是一个和它相似的内容 矩阵合并的方法以及详细代码示例 一起往下
  • Hive优化

    1 Fetch抓取 目的 让hive sql 能不走MR 尽量不走MR 通过hive的参数来配置 决定哪些sql可以不走MR set hive fetch task conversion 可选值 none minimal more 默认值
  • Java实现PDF导出/预览

    网上有很多关于PDF导出的文章 但是个人感觉实现的过于复杂 又是模板又是html的 有的还需要字体模板的支持 本片文章只是实现简单的PDF表格导出 可以实现PDF动态表格导出 预览 这类文章网上很少 就给你们整理一篇吧 实现思路 本地创建P
  • 自己写的跨数据库的表同步工具

    阅读本文大概需要 3 6 分钟 近期在做数据集市 遇到的痛点如下 1 数据采集过程繁琐 重复的脚本编写太多 从不同的数据库抽取数据 需要为不同的数据库写卸数脚本 再传输到数据集市文件服务器 再入库 每一环节都需要调度 2 不同的数据库写不同
  • Linux安装unrar

    Linux中unrar的安装 下载unrar wget https www rarlab com rar rarlinux x64 6 0 2 tar gz 解压文件 tar xf rarlinux x64 6 0 2 tar gz 安装
  • win10安装protobuf

    Win10安装protobuf 准备 安装VS 下载protobuf 安装cmake 下载gmock 安装 Cmake构建配置 使用VS编译protobuf 准备 安装VS 下载protobuf 下载地址 https github com
  • flutter app启动页的强制获取配置前先检查是否有网络

    判断网络状态 connectivity plus 2 3 9 late StreamSubscription
  • Java8 stream流的操作 map和list转换

    Java8 stream流的操作 1 将map的所有value转换成list 创建map并塞两个值 Map
  • Linux shell命令行可选参数的getopts命令使用例子

    Linux shell命令行可选参数的getopts命令使用例子 一 概述 getopts option DESCPRITION VARIABLE option 表示为某个脚本可以使用的选项 冒号如果某个选项 option 后面出现了冒号
  • pytorch余弦退火学习率CosineAnnealingLR的使用

    一 背景 再次使用CosineAnnealingLR的时候出现了一点疑惑 这里记录一下 其使用方法和参数含义 后面的代码基于 pytorch 版本 1 1 不同版本可能代码略有差距 但是含义是差不多的 二 余弦退火的目的和用法 2 1 为啥
  • flutter video_player视频播放器的横竖屏切换

    参考 需要使用到的库 import package flutter services dart 用到的方法 实现全屏功能代码 一般写在按钮或者初始化函数里 SystemChrome setPreferredOrientations Devi
  • linux添加静态路由

    linux下静态路由修改命令 方法一 添加路由 route add net 192 168 0 0 24 gw 192 168 0 1 route add host 192 168 1 1 dev 192 168 0 1 删除路由 rout
  • 推荐系统的学习历程(二)

    前面都是大二上学期的事情了 到了大二的下学期 老师急着要成果 我之前做的铺垫也可以得到一点体现了 经过了一个寒假的读论文 我也开始对这个算法有了不错的理解 发现这不过是统计学 高等数学 线性代数的简单应用而已 看过很多文献对这些算法的改进
  • java基础编程

    目录 一 java语言概述 1 适用的领域 2 特点 3 环境搭建 二 基本语法 1 关键字和标识符 1 1关键字 1 2保留字 1 3标识符 2 变量的使用 2 1分类 2 2定义变量的格式 2 3注意 2 4基本数据类型变量间的运算规则
  • 一类6维Lorenz型超混沌系统的有限时间驱动-响应同步

    本文基于Lypunov稳定性定理 通过构造Lyapunov函数以及设计提出一非线性反馈控制输入器 u u u 进而实现一类六维Lorenz型混沌系统的有限时间同步 本文所基于的一类六维Lorenz型超混沌系统可表示如下
  • C语言中定义字符串的几种方式

    1 什么是字符串 所谓字符串本质上就是以 0作为 结尾的特殊字符数组 2 定义字符串的过程中有哪些注意点 由于字符串本质上其实就是以 0作为 结尾的特殊字符数组 所以定义字符串时 必须保证字符串存储的最后一个元素为 0 当我们没有给定字符串
  • C语言解释器的实现--序(零)

    在写CuteC文本编辑器的同时 为了使之有脚本执行能力 特意实现了一个简易的C语言解释器 所谓的解释器 就是它是解析执行脚本文件的 并不产生可执行的目标代码 它具备了C语言的几乎全部的语法 随着时间的推移 我打算把它作为一个独立的项目来开发
  • 基于BGP/MPLS 虚拟专用网络实现企业与公网服务的相互访问

    一 实验拓扑图 1 拓扑图 二 实验目的 1 基于BGP MPLS 虚拟专用网络实现企业与公网服务的相互访问 三 设计需求 1 公司总部和分部与 Internet 之间利用 BGP MPLS 虚拟专用网络 实现互通 2 分部之间的通信需通过
  • 栈实现计算机复杂计算

    package com yg stack author GeQiLin date 2020 2 22 14 14 import jdk nashorn internal ir ReturnNode public class Calculat