栈的应用实例---中缀表达式求值
来源:互联网 发布:网络代销免费货源 编辑:程序博客网 时间:2024/06/08 19:27
1.中缀表达式求值实现类
package edu.tcu.soft;import java.util.Stack;/** * 功能:中缀表达式直接求值 */public class NifixExpre {// 定义操作数栈和操作符栈private Stack<Integer> operateNum = new Stack<Integer>();private Stack<Character> operateChara = new Stack<Character>();// 表达式处理(表达式:运算符【加、减、乘、除、左括号】 运算对象【正数、负数】)int expressionHandler(String expre) {char[] ex = expre.toCharArray();char item;// 顺序获取每一运算对象或者运算符for (int i = 0; i < ex.length; i++) {item = ex[i];// 如果当前字符为(,将运算符压入栈内if (item == '(') {operateChara.push(item);}// 如果当前字符为运算符 ) ,将运算符栈的运算符出栈直到遇到第一个(if (item == ')') {// 将操作符栈里面的元素一直出栈,直到遇到第一个左括号为止while (operateChara.peek() != '(') {char o = operateChara.pop();// 获取操作符Integer second = operateNum.pop();// 获取第二个运算对象Integer first = operateNum.pop();// 获取第一个运算对象Integer result = getResult(first, second, o);// 获取运算结果operateNum.push(result);// 将运算结果入栈}if (operateChara.peek() == '(') {// 将左括号移出栈operateChara.pop();}}if (item != '(' && item != ')') {// 如果当前字符为运算符,入运算符栈if (item == '+' || item == '-' || item == '*' || item == '/'|| item == '#') {// 如果操作符栈为空,入栈if (operateChara.empty()) {operateChara.add(item);} else {// 根据优先权的大小,判断操作符是否能进栈if (isPush(item, operateChara.peek())) {operateChara.push(item);} else {char o = operateChara.pop();// 获取操作符Integer second = operateNum.pop();// 获取第二个运算对象Integer first = operateNum.pop();// 获取第一个运算对象Integer result = getResult(first, second, o);// 获取运算结果operateChara.push(item); // 将当前的运算符入栈operateNum.push(result);// 将运算结果入栈}}}// 如果当前字符为运算对象else if (0 <= Integer.parseInt(String.valueOf(item))&& Integer.parseInt(String.valueOf(item)) <= 9) {operateNum.push(Integer.parseInt(String.valueOf(item)));}/*else if(0 <= Integer.parseInt(String.valueOf(item))&& Integer.parseInt(String.valueOf(item)) <= 9){Stack<Integer> stack=new Stack<>();int amount=0;while(0 <= Integer.parseInt(String.valueOf(ex[i]))&& Integer.parseInt(String.valueOf(ex[i])) <= 9){Integer sin=Integer.parseInt(String.valueOf(ex[i]));stack.push(sin);i++;}for(int j=0;j<stack.size();j++){amount=(int) (amount+stack.pop()*Math.pow(10, j));}System.out.println("amount"+amount);operateNum.push(amount);*/}}return operateNum.peek();}// 判断是否要把操作符移入栈内private boolean isPush(char item, Character peek) {if (getPriority(item) > getPriority(peek))return true;return false;}// 获取操作符的优先权值private int getPriority(Character peek) {if (peek == '#') {return 0;}if (peek == '(') {return 1;} if (peek == '+' || peek == '-') {return 2;}if (peek == '*' || peek == '/') {return 3;}else {return -1;}}// 计算private Integer getResult(Integer first, Integer second, char o) {switch (o) {case '+':return first + second;case '-':return first - second;case '*':return first * second;case '/':return first / second;default:break;}return null;}}
2.测试类
package edu.tcu.soft;public class Test { public static void main(String[] args) { NifixExpre expre=new NifixExpre(); System.out.println("中缀表达式求值:"+expre.expressionHandler("#3*(4+2)/2-5#"));}}
这个实现方法还不是很完善,只能进行个位数的加减乘除运算,
0 0
- 栈的应用实例---中缀表达式求值
- 栈的应用-中缀表达式求值
- 栈的应用之中缀表达式求值
- 中缀表达式转后缀表达式求值(栈的应用)
- 栈的应用——中缀表达式转后缀表达式,后缀表达式的求值,中缀表达式求值
- 数据结构(6)--栈的应用之中缀表达式求值
- 栈的应用——中缀表达式求值
- C++栈的应用——后缀表达式求值、中缀表达式到后缀表达式的转换
- 栈的应用 后缀表达式求值 后缀表达式与中缀表达式的转换
- 【数据结构】栈的应用---四则运算表达式求值(中缀表达式与后缀表达式转换)
- 栈的应用--算术表达式的求值(中缀转后缀然后计算后缀表达式的值)
- 中缀表达式转换成后缀表达式并求值(C++栈的应用)
- 堆栈的应用——中缀表达式求值
- 【数据结构】栈的应用——中缀表达式求值(c++)
- 栈的应用实例---表达式求值(C语言)
- 011.栈应用表达式求值C实例
- 栈的应用 表达式求值
- 表达式求值【栈的应用】
- 14 StringBuffer类与Arrays类*冒泡选择排序*Integer
- freewheel职位
- 53. Maximum Subarray
- 关于eclipse解压安装后不能运行
- js删除tr一行的解决方案
- 栈的应用实例---中缀表达式求值
- 文章标题
- java类方法对传入的参数的内存分配
- Golang 文件读取
- 基于大数据分析的异常检测方法及其思路实例
- java后台获取web项目全路径的方法
- 配置win7 iis后 本地连接网址 打不开网站或者一直在加载 网页加载不出来并且 提示下列错误
- spring 杂烩
- NOIP ++RP;