如题,用java实现简单的计算器。
如:
输入:3+2*2, 输出:7
输入:3/2, 输出:1
解题思路:
使用栈的特性,出入栈。声明两个栈,分别存数字和操作符。
将字符串转换为字符数组,循环,进行判断入栈,出栈和计算结果。
最后判断,如果操作符栈为空,则直接输出数字栈的结果,否则再计算一次然后返回结果。
代码如下:
public static Integer calc(String str){
char[] chars = str.toCharArray();
Stack<Integer> dataStack = new Stack();
Stack<Character> operStack = new Stack();
int len = chars.length;
for(int i = 0; i < len; i++){
char ch = chars[i];
// 判断是否是数字
if(Character.isDigit(ch)){
if(operStack.empty()){
//操作符栈为空,则直接将数字入栈
dataStack.push(ch - '0');
}else{
dataStack.push(ch - '0');
char oper = operStack.peek();
//否则,判断操作符栈栈顶元素是否是乘号或除号,是则进行计算
if(oper == '*' || oper == '/'){
Integer res = doCalc(dataStack, operStack.pop());
dataStack.push(res);
}
}
}else if(ch == '+' || ch == '-'){ // 判断是否是加或减
if(dataStack.size() >= 2){
//这里需要判断数字栈是否大于等于2(即够一次运算)
Integer res = doCalc(dataStack, operStack.pop());
dataStack.push(res);
}
operStack.push(ch);
}else if(ch == '*' || ch == '/'){ // 判断是否是乘或除
if(operStack.empty()){
operStack.push(ch);
}else{
char oper = operStack.peek();
//判断操作符栈栈顶元素是否是乘或除,如果是,则进行计算
if(oper == '*' || oper == '/'){
Integer res = doCalc(dataStack, operStack.pop());
dataStack.push(res);
}
operStack.push(ch);
}
}
}
if(operStack.empty()){
return dataStack.peek();
}else{
return doCalc(dataStack, operStack.pop());
}
}
函数doCalc进行四则运算,代码如下:
private static Integer doCalc(Stack<Integer> data, char oper){
Integer a = data.pop();
Integer b = data.pop();
switch(oper){
case '+':
return b + a;
case '-':
return b - a;
case '*':
return b * a;
case '/':
return b / a;
default:
}
return 0;
}
总结:
- 首先要知道Stack相关的方法。例如pop()是出栈, push()是入栈,peek()只是将栈顶元素取出来,并不会出栈。
- 判断字符是否是数字。
- 本程序只能实现简单的无符号的加减乘除运算。也是本人第一感觉写出来的代码。难免有问题,或者有更好的方法。欢迎指正!
本文介绍了一个使用Java实现的简单计算器,通过两个栈分别存储数字和操作符,支持基本的加减乘除运算。代码详细展示了如何处理输入字符串,进行运算并返回结果。
2339

被折叠的 条评论
为什么被折叠?



