如何优雅的写出一个字符串计算器(JAVA)

本文介绍了如何优雅地写出一个字符串计算器,通过将中缀波兰表达式转化为后缀表达式,利用栈辅助计算。首先定义一个判断字符是否为数字的函数,然后遍历输入的字符数组,针对数字、运算符和括号进行不同处理。对于括号,使用栈来处理其内部运算。最后,使用栈计算后缀表达式得到结果。递归实现将在另一篇文章中详细讨论。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

字符串计算器

坐标2020-4-24
经过-华为二面
面试官给了一张动态图,问我:二十分钟能写出一个简单的字符串计算器吗?
略微思考:应该可以吧
接着在混乱的思路中,想用递归,又想用栈,最后写出一个无数空指针异常的计算器,结束后,痛定思痛,今天就教大家写一个字符串计算器。

首先,我们一定需要一个函数来判断字符是否是数字,

 public static boolean isNum(char x){
   
        return x>=48 && x<=57;
    }//利用ascall码判断是否为数字

有了它,我们进行第二步,设计算法思路。
字符串计算器的解题思路呢,我在网上只看见一种,就是用中缀波兰表达式转化为后缀,然后逐个计算。而在我面试的过程中,我的第一反应是使用递归,将所有括号缩减,然后按先乘除,后加减的顺序计算,今天我们将两个思路都进行完善。

思路1:波兰表达式
首先我们看如下表达式 2+3*(6-2) 这个式子,也就是我们输入的式子,就是中缀波兰表达式,我们将它转化为后缀表达式,得到的应该是 2 3 6 2 - * +
大家发现什么规律了呢? 也就是将运算符按运算顺序放到数字的后面,我们计算的时候只需要用一个栈来辅助,就可以按顺序计算出来结果了。
有的小伙伴说,思路我懂,怎么写呢?且听我慢慢道来。

第一步,我们需要一些辅助工具,
1.字符串

StringBuilder stringBuilder = new StringBuilder();

使用StringBuilder来存储转化完成的后缀表达式。

2.栈

Stack<Character> stack = new Stack<>();

我们用栈来辅助存储。

3.原表达式的字符形式

char x[] = str.toCharArray();

我们把传入函数的字符串转化为字符型数组,这样方便使用isNum函数判断

那么现在函数就是这个样子

 public static String inorder (String str){
   
        Stack<Character> stack = new Stack<>();
        char x[] = str.toCharArray();
        StringBuilder stringBuilder = new StringBuilder();
        retrun null;
        }

下一步,我们遍历整个字符型数组

 public static String inorder (String str){
   
        Stack<Character> stack = new Stack<>();
        char x[] = str.toCharArray();
        StringBuilder stringBuilder = new StringBuilder();
        for(int i=0;i<x.length;i++){
   

        }
        retrun null;
        }

现在想想,我们遍历数组的过程中应该完成什么操作呢?
有以下几种情况
1.当前字符为数字
2.当前字符为运算符
3.当前字符为括号

在情况1中,我们只需要将其加入结果,因为我们最后的后缀表达式中,数字是按照原有顺序排列的。

 public static String inorder (String str){
   
        Stack<Character> stack = new Stack<>();
        char x[] = str.toCharArray();
        StringBuilder stringBuilder = new StringBuilder();
        for(int i=0
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值