计算器应用中字符串连续数字转数值格式的问题求助
解决计算器应用中多位数数字的识别问题
看起来你遇到了计算器逻辑里的典型问题:当前代码会把输入字符串中的数字按单个字符拆分处理,导致像30这样的多位数被拆成3.0和0.0两个独立元素压入栈,而不是识别为一个完整的数字。下面是具体的分析和修复方案:
问题根源
你的原代码将输入字符串按单个字符拆分后推入stringStack,然后每次只取出栈顶的单个字符判断是否为数字。这种方式完全忽略了连续数字字符属于同一个多位数的情况,自然会把多位数拆分开。
修复方案
我们需要修改逻辑,当遇到数字字符时,持续读取所有连续的数字字符(如果需要支持小数,还可以包含小数点),拼接成完整的数字字符串后再转换为Double压入栈。同时可以优化掉stringStack,直接遍历原字符串会更高效:
修改后的CalcLogic类代码
public class CalcLogic { private CharacterStack characterStack; private DigitStack digitStack; public CalcLogic() { characterStack = new CharacterStack(); digitStack = new DigitStack(); } public void convertString(String s) { int index = 0; int strLength = s.length(); while (index < strLength) { char currentChar = s.charAt(index); // 处理数字(支持整数和小数) if (Character.isDigit(currentChar) || currentChar == '.') { StringBuilder numStrBuilder = new StringBuilder(); // 连续读取所有数字/小数点字符 while (index < strLength && (Character.isDigit(s.charAt(index)) || s.charAt(index) == '.')) { numStrBuilder.append(s.charAt(index)); index++; } // 转换为Double并压入数字栈 digitStack.push(Double.parseDouble(numStrBuilder.toString())); } // 处理运算符和括号 else if ("(+=*-/^)".indexOf(currentChar) != -1) { characterStack.push(currentChar); index++; } // 跳过无关字符(比如空格) else { index++; } } System.out.println(digitStack); System.out.println(characterStack); } }
关键改进点
- 移除
stringStack:直接遍历原字符串,避免额外的栈操作开销,也更便于处理连续字符 - 连续数字拼接:用
StringBuilder收集所有连续的数字/小数点字符,确保多位数被识别为一个整体 - 高效字符判断:用
indexOf替代正则表达式判断运算符/括号,性能更优 - 支持小数扩展:如果你的计算器不需要处理小数,只需去掉代码中关于小数点的判断即可
测试效果
当你输入字符串"1+2*3*(30+4/2-(10+2))*2+1"(修正了你原输入中可能的笔误3(30为3*(30),digitStack会正确输出包含30.0和10.0的结果,符合你的预期:1.0 2.0 3.0 30.0 4.0 2.0 10.0 2.0 2.0 1.0(具体顺序取决于你的栈实现的输出格式)
内容的提问来源于stack exchange,提问作者Dartweiler
相关产品推荐
相关产品推荐

