数据结构之计算器的实现(JAVA)(四)
2023-09-14 09:08:01 时间
原理:
1.将中序表达式变化兴许表达式
2.当前字符为数字,将该数字放入栈中
3.当前字符为操作符,从栈中取出两个树,依据操作符来运算,将运算结果放入到栈中
4.反复,直到将字符操作完。此时栈中仅仅剩下一个元素,即要运算的结果
PS:我没有处理。仅仅能够执行10以内的运算,假设有须要能够扩展
package com.lip.datastructure.tree; import java.util.Iterator; import java.util.Stack; public class Calculator { public static void main(String[] args) { String obj = "a*(b+c)+c/d"; String obj1 = "2*(1+3)+9/3"; System.out.println(obj1+"="+calculator(obj1)); } //利用后序表达式计算 ///原理:1.当期字符为字母或者数字,则直接入栈 // 2.当前字符为操作符则从栈中取出两个数字计算 // 3.将计算结果再放入到栈中,栈中最后剩余的一个元素就是要求的结果 public static int calculator(String obj) { String postObj=tranform(obj); System.out.println(); Stack<Integer>stack=new Stack<Integer>(); for(int i=0;i<postObj.length();i++) { char ch=postObj.charAt(i); if(Character.isLetterOrDigit(ch))//字符或者数字 { stack.push(Integer.parseInt(ch+"")); } else//操作符 { //取出两个数 int op1,op2; op1=stack.pop(); op2=stack.pop(); switch (ch) { case '+': stack.push(op2+op1); break; case '-': stack.push(op2-op1); break; case '*': stack.push(op2*op1); break; case '/': stack.push(op2/op1); break; default: break; } } } return stack.pop(); } // 中序遍历改为兴许遍历 public static String tranform(String obj) { Stack<Character> stack = new Stack<Character>(); String obj2 = ""; for (int i = 0; i < obj.length(); i++) { char ch = obj.charAt(i); if (Character.isLetterOrDigit(ch))// 字母或数字直接输出 { obj2 += ch; System.out.print(ch); } else if (ch == ')')// 在栈中一致匹配到)操作符才停止出栈 { char temp; while ((temp = stack.pop()) != '(') { obj2 += temp; System.out.print(temp); } } else // 比較操作符的进栈优先级 { if (stack.isEmpty()) { stack.push(ch); continue; } char temp = stack.peek(); while (icp(ch) <= isp(temp))// 进栈优先级小于栈内优先级,则一直出栈 { System.out.print(temp); obj2 += temp; stack.pop(); if (stack.isEmpty()) break; temp = stack.peek(); } stack.push(ch); } } // 将栈中剩余的元素弹出来 while (!stack.isEmpty()) { char temp = stack.pop(); obj2 += temp; System.out.print(temp); } return obj2; } // 操作符在栈内的优先级 private static int isp(char ch) { switch (ch) { case '+': case '-': return 2; case '*': case '/': return 4; case ')': return 7; case '(': return 1; default: break; } return 0; } // 操作符进栈的优先级优先级 private static int icp(char ch) { switch (ch) { case '+': case '-': return 3; case '*': case '/': return 5; case ')': return 1; case '(': return 7; default: break; } return 0; } }
相关文章
- Java项目毕业设计:基于springboot+vue的电影视频网站系统「建议收藏」
- Java多线程详解_java支持多线程
- 二级java程序设计--Java SDK6.0的下载和操作[通俗易懂]
- java卸载 安装错误_Java卸载后无法重新安装 提示已安装过[通俗易懂]
- java 实现 按位异或_Java 按位异或的性质及其妙用
- java %08d_总结Java中String.format()的使用[通俗易懂]
- java工作流_Java 实现简单工作流
- java oracle数据备份_Java实现Oracle数据库备份
- java resourcebundle_Java – Properties和ResourceBundle类学习「建议收藏」
- java 阶乘算法_Java 实现阶乘算法
- 数据结构——栈(顺序栈)——Java
- java url加密_Java实现url加密处理的方法示例
- java+sm4+加密算法_SM4加密算法实现Java和C#相互加密解密
- Java学习-如何编译适配java版本的jar包
- 【Java】Best coding practices every java developer should
- Java与MySQL的实现协同(java和mysql)
- Java问题-java进程占用内存过高,排查原因详解编程语言
- Java实现Redis分布式锁(java实现redis锁)
- 实现Java实现Redis集合的技术研究(redis集合java)
- 版本配置Linux系统的默认Java版本(linux默认java)
- Java调用Redis实现高性能数据存储(java调用redis)
- Java实现MySQL数据插入(java插入mysql)
- 使用Java连接SQL Server数据库,轻松实现数据交互(java连sqlserver)
- 如何在Linux系统中指定Java版本(linux指定java)
- Linux系统下Java软件环境搭建指导(linux java软件)
- Oracle数据库中调用Java实现可扩展应用程序(oracle内嵌java)
- Java解答Oracle使用更轻松的实现方式(oracle写成java)
- 使用Java语言写Redis实现一个分布式缓存系统(用java写个redis)
- Java之oracle知多少(java的oracle)
- 编程Oracle数据库中实现Java编程的突破之道(oracle使用java)
- java数据结构实现顺序表示例
- java数据结构之java实现栈