一 .设计思想
利用堆栈转换后缀表达式:
中缀表达式:9+((10-2)*3+3*3)*4+10/2 转化为后缀表达式:9 10 2 - 3 * 3 3 * + 4 * + 10 2 / +
规则:从左到右遍历中缀表达式的每一个数字和符号,若是数字就输出,即成为后缀表达式的一部分;若是符号则先判断是否是右括号如若是右括号则输出栈顶到左括号间的所有符号成为后缀表达式一部分,如若不是则再判断其与栈顶符号的运算优先级,输出从栈顶高优先级到第一个低于当前符号优先级(或者左括号)这之间所有符号并将当前符号入栈,一直到最终输出后缀表达式为止。
后缀表达式的计算:
规则:从左到右遍历后缀表达式的每个数字和符号,遇到数字就进栈,遇到符号就将处于栈顶两个数字出栈,进行运算(如果是减被减数是第二个数)运算结果进栈,最后结果就在栈里直接输出就可以。
二.实现过程
逐个读取中缀表达式(char型):9*(3-1)+2
1.如果是数字则压入数字栈(如果是大于一位的数字则需要写个函数转换成int型)
2.如果是'('则压入运算符栈中
3.如果是'+'或者'-',判断一下运算符的栈顶元素,如果是'*','/','+','-'则出栈,调用出栈函数(利用数字栈和运算符栈算出中间结果),然后将该运算符压入运算符栈中
4.如果是'*'或者'/',判断一下运算符的栈顶元素,如果是'*'或者'/',则出栈,调用出栈函数,然后将该运算符压入运算符栈中
5.如果是'(',则直接调用出栈函数,直到将'('出栈为止
6.遍历完中缀表达式后,如果此时运算符栈不为空,则调用出栈函数逐个出栈
7.最后的结果是数字栈的栈顶元素
PS(从左到右遍历中缀表达式的每一个数字和运算符。
如果数字就输出(即存入后缀表达式);
如果是右括号,则弹出左括号之前的运算符;
如果优先级低于栈顶运算符,则弹出栈顶运算符,并将当前运算符进栈。
遍历结束后,将栈则剩余运算符弹出。)
三代码实现
import java.util.Random;
import java.util.Scanner;
public class szys {
public static void res(){
System.out.println("1.显示结果\t2.直接开始下一题");
}
public static void main (String[] arge){
System.out.println("*****请选择要随机生成的算法*****");
System.out.println("\t1,加法\t2,减法\t3,乘法\t4,除法");
System.out.println("**********");
Scanner sc=new Scanner(System.in
);
int s = sc.nextInt();
double result=0;
Random r = new Random();
int a = r.nextInt(100);
int b =r.nextInt(100);
switch(s){
case 1:System.out.println("-----|"+a+"+"+b+"=?|-----");result =a+b;res();break;
case 2:System.out.println("-----|"+a+"-"+b+"=?|-----");result =a-b;res();break;
case 3:System.out.println("-----|"+a+"*"+b+"=?|-----");result =a*b;res();break;
case 4:System.out.println("-----|"+a+"/"+b+"=?|-----");{float c=a;float d=b;result=c/d;}res();break;
default:System.out.println("输入有误,重新开始");main(null);break;
}
Scanner select =new Scanner(System.in
);
int se =select.nextInt();
switch (se){
case 1:System.out.println("本题的结果:"+result);main(null);break;
case 2:main(null);break;
default:System.out.println("输入有误,重新开始");main(null);
}
}
}
四代码测试