Java实现中序表达式
2018-08-10 11:14:22来源:博客园 阅读 ()
前序表达式的实现:https://www.cnblogs.com/libin-blogs/p/9445163.html
后序表达式的实现:https://www.cnblogs.com/libin-blogs/p/9445716.html
该文时中序表达式的实现,下面将介绍中序表达式以及实现过程
中序表达式的概念:对于我们来说,类似(1+2)*3+1+2*3这样的式子,有算术优先级,符合人的运算思维的式子叫做中序表达式。
缺点:计算机运算时不能考虑到优先级问题,只能依次按顺序扫描运算。
中序表达式实现步骤:
1、将表达式转成字符数组
2、依次取出字符数组,若该字符为数字,则入num栈(存数字),
若该字符为左括号,入ops栈(存算术符号和括号),
若该字符为运算符,判断栈是否为空,
当栈为空时,入ops栈,
当栈不为空时,
若字符为+或-,且栈顶字符为*或/,ops栈栈顶元素出栈,num出栈2个元素,与ops出栈元素做运算,直至栈顶元素为( 或 + 或 - ,字符入栈。
若字符为右括号,则ops栈一直出栈做运算,直至遇到左括号。
3、ops栈不为空时,依次出栈和num栈元素做运算,直至ops栈为空
4、取出num栈的唯一元素,即为表达式结果。
PS:原创,如有错误,请指出,感谢指教!
实现类:
1 package 表达式求值; 2 3 import java.util.Stack; 4 5 /* 6 * 中序表达式求值实现 7 */ 8 public class CenterExpression { 9 10 public double evaluate(String expression){ //传入中序表达式 11 char [] ex = expression.toCharArray(); 12 Stack<Double> num = new Stack<>(); 13 Stack<Character> ops = new Stack<>(); 14 for(int i = 0; i < ex.length; i++){ //循环将表达式依次入栈 15 char c = ex[i]; 16 if(c <= '9' && c >= '0'){ 17 num.push(Double.parseDouble(Character.toString(c))); 18 } 19 else if(c == '('){ 20 ops.push('('); 21 } 22 else if(c == ')'){ 23 while(true){ 24 char op = ops.pop(); 25 if(op == '('){ 26 break; 27 } 28 else{ 29 switch(op){ 30 case '+':num.push(num.pop()+num.pop());break; 31 case '-':num.push(num.pop()-num.pop());break; 32 case '*':num.push(num.pop()*num.pop());break; 33 case '/':num.push(num.pop()/num.pop());break; 34 default:break; 35 } 36 } 37 } 38 } 39 else if((c == '+' || c == '-' || c == '*' || c == '/') && ops.empty()){ 40 ops.push(c); 41 } 42 else if((c == '+' || c == '-' || c == '*' || c == '/') && !ops.isEmpty()){ 43 char op =ops.peek(); 44 while((op == '*' || op == '/') && (c == '+' || c == '-')){ 45 op = ops.pop(); 46 switch(op){ 47 case '+':num.push(num.pop()+num.pop());break; 48 case '-':num.push(num.pop()-num.pop());break; 49 case '*':num.push(num.pop()*num.pop());break; 50 case '/':num.push(num.pop()/num.pop());break; 51 default:break; 52 } 53 if(ops.isEmpty()){ 54 break; 55 } 56 else{ 57 op = ops.peek(); 58 } 59 } 60 ops.push(c); 61 } 62 } 63 while(!ops.isEmpty()){ //处理剩余可以按计算机扫描顺序处理的表达式 64 char op =ops.pop(); 65 switch(op){ 66 case '+':num.push(num.pop()+num.pop());break; 67 case '-':num.push(num.pop()-num.pop());break; 68 case '*':num.push(num.pop()*num.pop());break; 69 case '/':num.push(num.pop()/num.pop());break; 70 default:break; 71 } 72 } 73 return num.pop(); 74 } 75 76 public static void main(String [] args){ 77 CenterExpression exp = new CenterExpression(); 78 System.out.println(exp.evaluate("1*2+5*3")); 79 } 80 }
测试类:
package 表达式求值;
public class My_Test{
public static void main(String [] args){
CenterExpression exp = new CenterExpression();
System.out.println(exp.evaluate("1*2+5*3"));
}
}
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
上一篇:Struts2知识点小结(二)
下一篇:17mysql2█▓
- 国外程序员整理的Java资源大全(全部是干货) 2020-06-12
- 2020年深圳中国平安各部门Java中级面试真题合集(附答案) 2020-06-11
- 2020年java就业前景 2020-06-11
- 04.Java基础语法 2020-06-11
- DES/3DES/AES 三种对称加密算法实现 2020-06-11
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash