基本要求
实现文本计算器,支持加减乘除、括号。
基本思路:
首先是先将输入的文本字符串 通过正则表达式转换为一个个字符 再将其转换为后缀表达式:
其中中缀表达式转换为后缀表达式 需要使用到栈的相关操作 还有一些基本的规则:
1.遇到操作数,直接输出;
2.栈为空时,遇到运算符,入栈;
3.遇到左括号,将其入栈;
4.遇到右括号,执行出栈操作,并将出栈的元素输出,直到弹出栈的是左括号,左括号不输出;
5.遇到其他运算符’+”-”*”/’时,弹出所有优先级大于或等于该运算符的栈顶元素,然后将该运算符入栈;
6.最终将栈中的元素依次出栈,输出。
经过上面的步骤,得到的输出既是转换得到的后缀表达式。
还有就是当输入的字符中数字的位数不是一位时 分成字符时就需要特别考虑
还有差错检测:对于输入的文本计算式需要先进行差错检测 如果时错误的表达式即不需要进行计算即可:
因为能力有限 写的代码数字三位时 就会计算错误
下面附上个人的代码 :
import java.util.Scanner;
/*文本计算器,支持加减乘除、括号。*/
//1+2*(4-3)/2 (10+20)*3/5-6 10+2*(40-3)/2
public class Calculate {
public static String[] stack= new String[100];//定义栈
public static int top=0;
public static void push(String a) {
//入栈操作
if(top>=100) return;
stack[top++]=a;
}
public static String pop() {
//出栈操作
if(top==0) return null;
return stack[--top];
}
public static boolean isEmpty() {
//判断栈是否为空
if(top==0) return true;
return false;
}
public static String getTop() {
//获取栈顶元素
if(top<100)
return stack[top-1];
return null;
}
public static void zl1(String[] s1,String[] s2) {
//s2是后缀表达式
int j=0;
for(int i=0;i<s1.length;i++)//遍历字符串
{
if(s1[i].equals("")) break;
else if(isEmpty()&&(s1[i].equals("+")||s1[i].equals("-")||s1[i].equals("*")||s1[i].equals("/"))) {
push(s1[i]);
}
else if(!s1[i].equals("+")&&!s1[i].equals("-")&&!s1[i].equals("*")&&!s1[i].equals("/")&&!s1[i].equals("(")&&!s1[i].equals(")")) {
s2[j++]=s1[i];
}
else if(s1[i].equals("(")) push(s1[i]);
else if(s1[i].equals(")