目录
非原创 计算器1 :网络资源模板--基于 Android Studio 实现的简易计算器
一、项目演示
二、项目测试环境
三、项目详情
这段代码实现了将中缀表达式转换为后缀表达式的功能。下面是它的主要逻辑和步骤总结:
1. 使用了一个运算符栈 `stack` 和一个 `StringBuffer` 类型的 `postfix` 变量来存储后缀表达式结果。
2. 通过遍历中缀表达式字符串 `infix`,逐个处理每个字符 `ch`。
3. 对于不同的字符,采取不同的处理方式:
- 如果是运算符 `+` 或 `-`,将栈顶的优先级高于或等于当前运算符的运算符弹出并添加到后缀表达式中,然后将当前运算符入栈。
- 如果是运算符 `×` 或 `÷`,类似地处理,但是它们的优先级较高。
- 如果是 `(`,直接入栈。
- 如果是 `)`,弹出栈顶元素直到遇到 `(`,将弹出的运算符添加到后缀表达式中。
- 如果是数字或小数点,直接添加到后缀表达式中。
4. 最后,将栈中剩余的运算符依次弹出并添加到后缀表达式中。
总结来说,这段代码利用栈的先入后出特性,实现了中缀表达式到后缀表达式的转换,确保了运算符优先级的正确顺序。
public static StringBuffer toPostfix(String infix){
//把中缀表达式转换成后缀表达式
Stack<String> stack=new Stack<String>(); //运算符栈,顺序栈
StringBuffer postfix=new StringBuffer(infix.length()*2); //后缀表达式字符串
int i=0;
while(i<infix.length()){
char ch=infix.charAt(i);
switch(ch){
case '+':
case '-':
while(!stack.isEmpty()&&!stack.peek().equals("(")) //如果栈不为空且栈顶元素不是"(",则出栈
postfix.append(stack.pop()); //且添加到后缀表达式串
stack.push(ch+""); //ch入栈
i++;
break;
case '×':
case '÷':
while(!stack.isEmpty()&&(stack.peek().equals("×")||stack.peek().equals("÷"))) //如果栈顶元素不为空且栈顶元素是"*"或是"/"时,则出栈
postfix.append(stack.pop());
stack.push(ch+"");
i++;
break;
case '(':
stack.push(ch+""); //直接入栈
i++;
break;
case ')':
String out=stack.pop();
while(out!=null&&!out.equals("(")){ //如果栈顶元素不为空且不为"("时
postfix.append(out); //添加到后缀表达式串
out=stack.pop(); //把此时位于栈顶的"("弹出
}
i++;
break;
default:
while((i<infix.length()&&ch>='0'&&ch<='9')||(i<infix.length()&&ch=='.')){
postfix.append(ch); //如果是数字直接添加到后缀表达式串
i++;
if(i<infix.length())
ch=infix.charAt(i);
}
postfix.append(" ");
}
}
while(!stack.isEmpty()) //所有运算符出栈
postfix.append(stack.pop()); //添加到后缀表达式中
return postfix;
}
这段代码是一个用于计算数学表达式结果的方法。让我来解释一下它的主要逻辑和功能:
1. **获取输入的算式:**
- 首先从界面元素 `text` 中获取用户输入的数学表达式,保存在变量 `infix` 中。
2. **处理负号的情况:**
- 如果表达式的第一个字符是负号 `-`,则在其前面插入字符 `0`,以处理负数的情况。
3. **处理括号中负数的情况:**
- 遍历整个表达式字符串,如果发现类似于 `9-(-3)` 的情况(即括号中包含负数),在负号 `-` 前面插入字符 `0`,使其成为双目运算符。
4. **转换为后缀表达式:**
- 调用 `toPostfix(infix)` 方法将中缀表达式 `infix` 转换为后缀表达式 `postfix`,这样可以方便后续的计算。
5. **计算表达式结果:**
- 调用 `toValue(postfix)` 方法计算后缀表达式的值,并将结果存储在 `result` 中。
6. **格式化结果:**
- 使用 `String.format` 将结果格式化为小数点后7位的字符串,以规避计算中可能出现的极小误差。
- 使用正则表达式去掉结果中多余的 `0`,以及末尾的小数点 `.`,以得到最终的计算结果字符串 `re`。
7. **返回结果:**
- 将处理好的最终结果字符串 `re` 返回给调用者。
总结来说,这段代码通过处理输入表达式中的负号和括号中的负数,将中缀表达式转换为后缀表达式,并最终计算出表达式的结果并返回。
public String getResult(){
//获取运算结果
String infix = text.getText().toString();//获取输入的算式
StringBuffer stringBuffer = new StringBuffer(infix);//把String类型转换为StringBuffer
if(infix.charAt(0)=='-'){
//判断字符串第一位是否为'-',如果是在负号前面加0
stringBuffer.insert(0,0);
}
for(int i = 1;i < infix.length();i++){
//从第二位开始遍历字符串,用来检测类似9-(-3)即括号中包含负数的情况
if(stringBuffer.charAt(i-1)=='(' && stringBuffer.charAt(i)=='-'){
stringBuffer.insert(i,0);//在'-'前面加0,使其变成双目运算
}
}
infix = stringBuffer.toString();//把StringBuffer转换回String类型
StringBuffer postfix=toPostfix(infix);
Double result=toValue(postfix);
String re=String.format("%.7f",result);//规避极小误差
re = re.replaceAll("0+?$", "");//去掉多余的0
re = re.replaceAll("[.]$", "");//如最后一位是.则去掉
return re;
}
四、完整的项目源码
👇👇👇👇👇快捷获取方式👇👇👇👇👇