Java中可以利用双栈算法实现算术表达式求值,下面结合代码讲解简单和复杂两种情况

1、简单的算术表达式:(((3-1)*2)+3) 左括号全在左边时!

主要思想:
(1)利用两个栈,一个栈存储数字<栈顶到栈低依次是3123>,一个栈存储符号<栈顶到栈低依次是(((-)*)+)>

(2)符号栈弹出一个符号时,是括号时则忽略,否则数据栈弹出两个数据利用该符号进行计算,将计算结果在入栈

完整java代码如下:

import java.util.*;public class StackCalculator {public static void main(String[] args) {@SuppressWarnings("resource")Scanner scan=new Scanner(System.in);String string=scan.nextLine();//将字符串转化成char类型数组char[] c=new char[string.length()];for(int i=0;i<string.length();i++){c[i]=string.charAt(i);}Stack<Integer> stackint=new Stack<Integer>();Stack<Character> stackchar=new Stack<Character>();for(int i=(string.length()-1);i>=0;i--){char ch=c[i];if(ch>='0'&&ch<='9'){//将char转成string,然后再讲string转成int<调用函数>String s=ch+"";stackint.push(Integer.parseInt(s));}if(ch>='('&&ch<='/'){stackchar.push(ch);}}char sign;int a,b,data=0;while(!stackchar.isEmpty()){sign=stackchar.pop();if(sign=='+'){a=stackint.pop();b=stackint.pop();data=a+b;stackint.push(data);}else if(sign=='-'){a=stackint.pop();b=stackint.pop();data=a-b;stackint.push(data);}else if(sign=='*'){a=stackint.pop();b=stackint.pop();data=a*b;stackint.push(data);}else if(sign=='/'){a=stackint.pop();b=stackint.pop();if(b==0){System.out.println("除数为0!");System.exit(0);}data=a/b;stackint.push(data);}}data=stackint.pop();System.out.println("Result="+data);}
}

2、复杂的算术表达式:1+2*3+(4*5+6)*7,需要转化成后缀表达式:123+45*6+7*+

主要思想:

(1)当读到一个操作数时,立即将它放到输出中。操作符则不立即输出,放入栈中。遇到左圆括号也推入栈中

(2)如果遇到一个右括号,那么就将栈元素弹出,将符号写出直到遇到一个对应的左括号。但是这个左括号只被弹出,并不输出

(3)在读到操作符时,如果此时栈顶操作符优先性大于或等于此操作符,弹出栈顶操作符直到发现优先级更低的元素位置。除了处理)的时候,否则决不从栈中移走”(”。操作符中,+-优先级最低,()优先级最高

(4)如果读到输入的末尾,将栈元素弹出直到该栈变成空栈,将符号写到输出中

(5)上述四个原则便可将中缀表达式转化成后缀表达式,然后对后缀表达式进行处理得到最终结果<具体方式:利用一个数据栈,将后缀表达式的数据依次入栈,遇到符号时则将栈中弹出两个数据,然后利用该符号进行计算,将计算结果再入栈,从此往复>

完整Java代码如下:

import java.util.*;public class StackCalculators {public static void main(String[] args) {@SuppressWarnings("resource")Scanner scan=new Scanner(System.in);String string=scan.nextLine();//将字符串转化成char类型数组char[] carray=new char[string.length()];for(int i=0;i<string.length();i++){carray[i]=string.charAt(i);}//下面程序将中缀表达式转化成后缀表达式<重点>char a,b;int k=0;char[] charray=new char[100];Stack<Character> stackchar=new Stack<Character>();Stack<Integer> stackint=new Stack<Integer>();for(int i=0;i<string.length();i++){a=carray[i];if(a>='0'&&a<='9'){charray[k++]=a;}else if(a=='*'||a=='/'||a=='('){stackchar.push(a);}else if(a==')'){b=stackchar.pop();while(b!='('){charray[k++]=b;b=stackchar.pop();}}else if(a=='+'||a=='-'){if(stackchar.isEmpty())stackchar.push(a);else{do{b=stackchar.pop();if(b=='(')stackchar.push(b);elsecharray[k++]=b;}while(!stackchar.isEmpty()&&b!='(');stackchar.push(a);}}}while(!stackchar.isEmpty()){b=stackchar.pop();charray[k++]=b;}//利用后缀表达式和一个整型数据栈计算出结果int data1,data2,data=0;for(int i=0;i<k;i++){char ch=charray[i];if(ch>='0'&&ch<='9'){//将char转成string,然后再讲string转成int<调用函数>String str=ch+"";stackint.push(Integer.parseInt(str));}else{data1=stackint.pop();data2=stackint.pop();if(ch=='+'){data=data1+data2;stackint.push(data);}else if(ch=='-'){data=data2-data1;stackint.push(data);}else if(ch=='*'){data=data1*data2;stackint.push(data);}else if(ch=='/'){if(data1==0){System.out.println("除数为0!");System.exit(0);}else{data=data2/data1;stackint.push(data);}}}}data=stackint.pop();System.out.println("Result="+data);}
}

java算术表达式求值-中缀表达式转后缀表达式相关推荐

  1. nyoj 1272 表达式求值(中缀式转后缀式)

    表达式求值 时间限制:1000 ms  |  内存限制:65535 KB 难度:3 描述 假设表达式定义为: 1. 一个十进制的正整数 X 是一个表达式. 2. 如果 X 和 Y 是 表达式,则 X+ ...

  2. c 语言表达式求值中缀变后缀,表达式求值关于中缀式转后缀式的问题!

    已结贴√ 问题点数:10 回复次数:6 表达式求值关于中缀式转后缀式的问题! 本人看资料的时候遇到一段代码,这段代码中转为后缀式的优先级那句不明白,请大神赐教,代码如下(c语言) #include # ...

  3. linux算术表达式求值数据结构,数据结构:算数表达式求值演示

    题目:设计一个程序,演示用算符优先法对算数表达式求值的过程. 一.需求分析 以字符序列的形式从终端读入输入语法正确.不含变量的整数表达式.利用教科书表3.1给出的算符优先关系,实现对算数四则混合运算表 ...

  4. 用python编写表达式求值_用Python3实现表达式求值

    Problem Description yizhen has no girlfriend due to his stupid brain that he even can't solve a simp ...

  5. python作业表达式求值_用Python3实现表达式求值

    一.题目描述 请用 python3编写一个计算器的控制台程序,支持加减乘除.乘方.括号.小数点,运算符优先级为括号>乘方>乘除>加减,同级别运算按照从左向右的顺序计算. 二.输入描述 ...

  6. c语言求不定式的最大值,C语言之四则运算表达式求值(链栈)—支持浮点型数据,负数, 整型数据运算...

    运算符间的优先级关系: 链栈结构体定义: 数据域使用字符串长度为20的字符数组(故需要注意判断读取的字符串是运算符还是数值) 可支持浮点型数据,负数, 整型数据的运算 float EvaluateEx ...

  7. 字符串算术表达式求值-简单计算器实现(栈)-数据结构和算法(Java)

    1 字符串算术表达式分类 字符串算术表达式分为前缀表达式.中缀表达式和后缀表达式.其中前缀表达式又称波兰表达式,后缀表达式基于前缀表达式,又称逆波兰表达式.下面给出百度百科关于几种表达式的定义: 前缀 ...

  8. 【经典算法】-算术表达式求值

    算术表达式求值 中缀表达式 我们平时写的计算式的式子一般是这样子 格式:"操作数1 操作符 操作数2"12 * (3 + 4) - 6 + 8 / 2; // 中缀表达式 中缀表达 ...

  9. AVIATOR——轻量级JAVA表达式求值引擎

    简介 Aviator是一个高性能.轻量级的java语言实现的表达式求值引擎,主要用于各种表达式的动态求值.现在已经有很多开源可用的java表达式求值引擎,为什么还需要Avaitor呢? Aviator ...

  10. java aviator_Aviator 表达式求值引擎开源框架

    简介¶ Aviator是一个高性能.轻量级的java语言实现的表达式求值引擎,主要用于各种表达式的动态求值.现在已经有很多开源可用的java表达式求值引擎,为什么还需要Avaitor呢? Aviato ...

最新文章

  1. MySQL优化篇:数据准备
  2. Homebrew安装(MacOS)
  3. 6.00 Introduction to Computer Science and Programming lec5: Objects in Python
  4. 时下流行的9种恶意软件,你都了解吗?
  5. MySQL Bit Functions and Operators(二进制方法)
  6. Python使用ffmpeg下载m3u8拼接为视频
  7. 美国特勤局发布十大网络通缉犯名单
  8. 如何配置 Windows XP SP2 中的 Internet Explorer 增强安全功能
  9. 两则新闻的另外一种角度
  10. java.text.MessageFormat 专题
  11. 超简单的html登录界面
  12. Linux安装yum工具-安装过程
  13. cad刷新快捷键_47个CAD快捷键+50个技巧,了解这些CAD操作,你就偷着乐吧
  14. 生活之游戏中的心理学
  15. 8g内存一般占用多少_你到底需要多大内存?4G、8G还是16G
  16. php远程控制代码,内部网络机器的远程控制软件UltraVNC及其源代码
  17. android如何获取RAM和ROM使用情况
  18. Event Sourcing 和 CQRS
  19. APK反编译工具在ubuntu的安装及使用
  20. 供电抑制比 (PSRR)与开环闭环 D 类放大器

热门文章

  1. Oracle单实例数据库迁移到Oracle RAC 环境之(2)--实施篇
  2. 梦断代码----阅读笔记3
  3. jetty client 与apache http client的实现、分析
  4. Hibernate上路_18-Hibernate查询方式
  5. linux 如何查看 块设备_理解Linux操作系统中的块设备
  6. 置为底层_C语言之C语言的底层操作
  7. python字符串以什么为结束符_Python代码中 如何判断字符串是否使用指定字符结尾(endswith)呢?...
  8. 3.2自编码器(变分自编码器,VAE)
  9. OpenCV-图像处理(22、像素重映射(cv::remap))
  10. python分布式爬虫_python-分布式爬虫