博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java 逆波兰表达式
阅读量:5290 次
发布时间:2019-06-14

本文共 3939 字,大约阅读时间需要 13 分钟。

最近想把这破机 装成WIN7 想想还是算了 ...  反正用的机会也不多。

不过 发现了一些 想念的东西

从前的作业.

从前的记忆.

package org.lmz;import java.util.Queue;import java.util.Scanner;import java.util.Stack;import java.util.concurrent.LinkedBlockingQueue;public class calculator_test {	static String operator = "+-*/%^()";	/**	 * 预处理表达式,正、负号前加0(如果一个加号(减号)出现在最前面或左括号后面,则该加号(减号)为正负号)  比如  -1-(-1+1) 这种表达式 会处理成 0-1-(0-1+1)	 */	public static String pretreatment(String str) {		StringBuffer sb = new StringBuffer(str);		for (int i = 0; i < sb.length(); i++) {			char c = sb.charAt(i);			if (operator.indexOf(c) >= 0) {				if (i == 0) {					sb.insert(0, '0');					i++;				} else if (sb.charAt(i - 1) == '(') {					sb.insert(i, '0');					i++;				}			}		}		return sb.toString();	}	/***	 * 0 优先级相等 ; -1 op1 优先级大于op2; 1 op2 优先级大于 op1	 */	public static int opcompare(char op1, char op2) {		if (op1 == '(') { // 遇到括号 就直接入栈 所以 op2 大			return 1;		}		if ('^' == op1) {			if (op2 == '^') {				return 0;			}			return -1;		} else if ("+-".indexOf(op1) >= 0) {			if ("+-".indexOf(op2) >= 0) {				return 0;			}			return 1;		} else // if("*/%".indexOf(op1) >=0) 没必要 再判断是否为 */% 了		{			if ("+-".indexOf(op2) >= 0) {				return -1;			} else if ('^' == op2) {				return 1;			}			return 0;		}	}	/**	 * 计算传入的算术表达式 	 */	public static double Calculator2(String s) throws Exception {		//预处理式子		String prestr = pretreatment(s);		//用于保存  逆波兰式 的队列 		LinkedBlockingQueue
polish = new LinkedBlockingQueue
(); // 拼接 数字 char ---> numble StringBuffer temp = new StringBuffer(); Stack
stack = new Stack
(); for (int i = 0; i < prestr.length(); i++) { char c = prestr.charAt(i); //如果找到 操作符 if (operator.indexOf(c) >= 0) { if (temp.length() > 0) {//如果 有数字 就压栈 polish.offer(temp.toString()); temp = new StringBuffer(); } switch (c) { case '(': stack.push(c); break; case ')': while (stack.size() > 0) { char op = stack.pop(); if (op != '(') { polish.offer(String.valueOf(op)); } else { break; } } break; default: if (stack.size() == 0) { stack.push(c); } else { while (stack.size() > 0) { char op1 = stack.lastElement(); int com = opcompare(op1, c); if (com <= 0) { polish.offer(String.valueOf(stack.pop())); } else { stack.push(c); break; } } if (stack.size() == 0) { stack.push(c); } } break; } } else { temp.append(c); } } if (temp.length() > 0) { polish.offer(temp.toString()); } while (stack.size() > 0) { polish.offer(String.valueOf(stack.pop())); } System.out.println("Calcstra Queue:" + polish.toString()); return CalcstraWithQueue(polish); } /** * 计算 逆波兰表达式 用队列表示 * @throws Exception 各种错误都有可能 */ public static double CalcstraWithQueue(Queue
que) throws Exception { Stack
stack = new Stack
(); while(true) { String str = que.poll(); if(str == null) { break; } if (operator.indexOf(str) >= 0) { double num2 = stack.pop(); double num1 = stack.pop(); double tempresult = 0; switch (str.charAt(0)) { case '+': tempresult = num1 + num2; break; case '-': tempresult = num1 - num2; break; case '*': tempresult = num1 * num2; break; case '/': if(num2 == 0) { throw new Exception("出错:除数为 0"); } tempresult = num1 / num2; break; case '%': tempresult = num1 % num2; break; case '^': tempresult = Math.pow(num1, num2); break; default: throw new Exception("运算符: " + str + " 未识别!"); } stack.push(tempresult); } else { stack.push(Double.valueOf(str)); } } return stack.pop(); } public static void main(String[] args) { Scanner reader = new Scanner(System.in); while(true) { String s = reader.nextLine(); double result = 0; try { result = Calculator2(s); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println(result); } }}

转载于:https://www.cnblogs.com/jiangu66/p/3177617.html

你可能感兴趣的文章
2017-2018-2 20155309 南皓芯 Exp9 Web安全基础
查看>>
Leetcode Reverse Words in a String
查看>>
一文读懂内网、公网和NAT
查看>>
NotMapped属性特性
查看>>
go 语言 基础 类型(1)
查看>>
idea的初次使用
查看>>
正则表达式
查看>>
golang数据结构之定时器篇
查看>>
IBM内存三技术:Chipkill、MPX、MM
查看>>
css3伪类元素
查看>>
php部分,一个用递归无限分类的方法
查看>>
android,eclipse
查看>>
SpringBoot 上下文获取注入的Bean
查看>>
归并排序的进一步理解
查看>>
C - Wooden Sticks
查看>>
Spring boot中普通工具类不能使用@Value注入yml文件中的自定义参数的问题
查看>>
[8.3] Magic Index
查看>>
(转·)WMPLib
查看>>
C语言结构体对齐
查看>>
跨应用Session共享
查看>>