IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> 利用栈实现综合计算器(java编写) -> 正文阅读

[Java知识库]利用栈实现综合计算器(java编写)

作者:recommend-item-box type_blog clearfix

栈实现综合计算器

只是考虑加减乘除的情况下
使用栈完成表达式的计算思路:
1.通过一个index(索引),来遍历表达式
2.如果遍历的是数字,则直接进入数栈
3.如果遍历的是一个符号,则需要分一下几种情况:
?(1)如果当前的符号栈是空的,则符号可直接入栈
?(2)如果当前的符号栈非空,则需要进行比较,当前操作符的优先级小于或等于栈中的操作符,则需要从数栈中pop出两个数,再从符号栈中pop一个符号,进行运算,将得到的结果再入数栈,当前的符号入符号栈;如果当前操作符的优先级大于符号栈中的操作符,则当前操作符直接入符号栈。
4.当表达式被遍历完毕,就顺序从数栈和符号栈中 pop出相应的数和符号,并进行运算
5.最后在数栈中只有一个数字,就是表达式结果

代码如下,纯纯按照上述思路来完成的代码,代码不是很精炼,很浪费空间,但是很好理解,很适合初学者从理论的理解上升到代码的实现

public class Calculation {
    public static void main(String[] args) {
        String expretion = "70+120*6-4";
        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 ch = ' ';
        String keepNum = "";

        while (true){
            ch = expretion.substring(index,index+1).charAt(0);
            if (operStack.isOper(ch)){
                if (!operStack.isEmpty()){
                    if (operStack.priority(ch) <= operStack.priority(operStack.peek())){
                        num1 = numStack.pop();
                        num2 = numStack.pop();
                        oper = operStack.pop();
                        res = numStack.cal(num1,num2,oper);
                        numStack.push(res);
                        operStack.push(ch);
                    }else{
                        operStack.push(ch);
                    }
                }else{
                    operStack.push(ch);
                }
            }else{
                keepNum += ch;
                if (index == expretion.length() - 1){
                    numStack.push(Integer.parseInt(keepNum));
                }else{
                    if (operStack.isOper(expretion.substring(index+1,index+2).charAt(0))){
                        numStack.push(Integer.parseInt(keepNum));
                        keepNum = "";
                    }
                }
            }
            index++;
            if (index >= expretion.length()){
                break;
            }
        }

        while (true){
            if (operStack.isEmpty()){
                break;
            }
            num1 = numStack.pop();
            num2 = numStack.pop();
            oper = operStack.pop();
            res = numStack.cal(num1,num2,oper);
            numStack.push(res);
        }
        System.out.println("表达式" + expretion + "结果为:" + numStack.pop());
    }
}


class ArrayStack2{
    private int maxSize;//栈的大小
    private int[] stack;//数组模拟栈,数据放入该数组中
    private int top = -1;//top表示栈顶,初始化为-1

    public ArrayStack2(int maxSize){
        this.maxSize = maxSize;
        stack = new int[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;
        }
        stack[++top] = value;
    }
    //出栈
    public int pop(){
        if (isEmpty()){
            throw new RuntimeException("栈空,没有数据可以出栈");
        }
        return stack[top--];
    }

    //遍历栈
    public void list(){
        if (isEmpty()){
            System.out.println("栈空,没有数据");
            return;
        }
        for (int i=top;i>=0;i--){
            System.out.println("stack[" + i + "]:" + stack[i]);
        }
    }
    //判断优先级,只包括+,-,*,/
    public int priority(int oper){
        if (oper == '+' || oper == '-'){
            return 0;
        }else if(oper == '*' || oper == '/'){
            return 1;
        }else{
            return -1;
        }
    }
    //判断是否是运算符
    public boolean isOper(char val){
        return val == '+' || val == '-' || val == '*' || val == '/';
    }
    //计算方法
    public int cal(int num1,int num2,int oper){
        int res = 0;
        switch (oper){
            case '+':
                res = num1 + num2;
                break;
            case '-':
                res = num2 - num1;
                break;
            case '*':
                res = num1 * num2;
                break;
            case '/':
                res = num2 / num1;
                break;
            default:
                break;
        }
        return res;
    }
    //查看栈顶元素
    public int peek(){
        return stack[top];
    }
}

本篇文章是根据尚硅谷数据结构视频进行总结和代码实现,谢谢尚硅谷大学教会我java知识

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2021-12-23 15:37:37  更:2021-12-23 15:40:03 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 7:36:06-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码