`

java实现计算算术表达式的值(后缀表达式方式)

阅读更多
package zn.sd.ly.jtree.test;

/**
 * 表达式
 * 
 * @author 风华褚胜--刘胜军
 */
import java.util.Arrays;
import java.util.Scanner;
import java.util.Stack;

public class Four {
	@SuppressWarnings("resource")
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		System.out.println("请输入标准表达式(exit退出):");
		String str = sc.nextLine();
		while (!str.equals("exit")) {
			if (judge_kuohao(str)) {
				System.out.println("括号匹配成功!");
				System.out.println(jisuan(getHouzhui(f(str))));
			} else {
				System.out.println("括号匹配不成功,或者包含不规则括号!");
			}
			System.out.println("请输入标准表达式(exit退出):");
			str = sc.nextLine();
		}
	}

	/**
	 * 
	 * @param str
	 *            传入的完整算术表达试字符串
	 * @return 返回boolean值,如果匹配成功,返回true,反之false
	 */
	public static boolean judge_kuohao(String str) {
		Stack<Character> s = new Stack<Character>();
		/**********************************/
		char[] ch = new char[128];
		ch['1'] = '1';
		ch['2'] = '2';
		ch['3'] = '3';
		ch['4'] = '4';
		ch['5'] = '5';
		ch['6'] = '6';
		ch['7'] = '7';
		ch['8'] = '8';
		ch['9'] = '9';
		ch['0'] = '0';
		ch['('] = '(';
		ch[')'] = ')';
		ch['['] = '[';
		ch[']'] = ']';
		ch['{'] = '{';
		ch['}'] = '}';
		ch['.'] = '.';
		ch['+'] = '+';
		ch['-'] = '-';
		ch['*'] = '*';
		ch['/'] = '/';
		/**********************************/
		for (int i = 0; i < str.length(); i++) {
			char t = str.charAt(i);
			if (t > 128 || ch[t] != t) {
				return false;
			}
			if (t == '(' || t == '[' || t == '{') {
				s.push(t);
			} else if (t == ')' || t == ']' || t == '}') {
				char temp = '\u0000';
				if (s.size() > 0)
					temp = s.pop();
				else
					return false;
				if (!((temp == '(' && t == ')') || (temp == '[' && t == ']') || (temp == '{' && t == '}'))) {
					return false;
				}
			} else {

			}
		}
		if (s.size() != 0)
			return false;
		return true;
		/**********************************/
	}

	/**
	 * 
	 * @param str
	 *            传入的完整算术表达试字符串
	 * @return 完整算术表达试字符串中每个元素组合而成的数组
	 */
	public static Object[] f(String str) {
		Stack<Object> s = new Stack<Object>();
		int left = 0, right = 0, tag = ((str.charAt(0) >= '0' && str.charAt(0) <= '9')
				|| (str.charAt(0) == '.') ? 0 : 1);
		for (int i = 0; i < str.length(); i++) {
			char t = str.charAt(i);
			if ((t >= '0' && t <= '9') || (t == '.')) {
				right++;
				tag = 0;
			} else {
				if (left != right) {
					s.push(new Double(str.substring(left, right)));
					left = right;
				}
				right++;
				s.push(str.substring(left, right));
				left = right;
				tag = 1;
			}
			if (right == str.length()) {
				if (left != right) {
					if (tag == 1)
						s.push(str.substring(left, right));
					else
						s.push(new Double(str.substring(left, right)));
					left = right;
				}
			}
		}
		System.out.println(Arrays.toString(s.toArray()));
		return s.toArray();
	}

	/**
	 * 获取后缀表达式
	 * 
	 * @param f
	 *            完整算术表达试字符串中每个元素组合而成的数组
	 * @return 后缀表达式数组
	 */
	public static Object[] getHouzhui(Object[] f) {
		Stack<Object> s = new Stack<Object>();
		Stack<Object> n = new Stack<Object>();
		for (int i = 0; i < f.length; i++) {
			if (f[i].equals("(") || f[i].equals("[") || f[i].equals("{")) {
				s.push("(");
			} else if (f[i].equals("*")) {
				while ("/".equals((s.size() > 0) ? s.lastElement() : "")) {
					n.push(s.pop());
				}
				s.push("*");
			} else if (f[i].equals("/")) {
				while ("*".equals((s.size() > 0) ? s.lastElement() : "")) {
					n.push(s.pop());
				}
				s.push("/");
			} else if (f[i].equals("+")) {
				while (("*".equals((s.size() > 0) ? s.lastElement() : ""))
						|| ("/").equals((s.size() > 0) ? s.lastElement() : "")
						|| ("-").equals((s.size() > 0) ? s.lastElement() : "")) {
					n.push(s.pop());
				}
				s.push("+");
			} else if (f[i].equals("-")) {
				while (("*".equals((s.size() > 0) ? s.lastElement() : ""))
						|| ("/").equals((s.size() > 0) ? s.lastElement() : "")
						|| ("+").equals((s.size() > 0) ? s.lastElement() : "")) {
					n.push(s.pop());
				}
				s.push("-");
			} else if (f[i].equals(")") || f[i].equals("]") || f[i].equals("}")) {
				while (!"(".equals((s.size() > 0) ? s.lastElement() : "")) {
					n.push(s.pop());
				}
				s.pop();
			} else {
				n.push(f[i]);
			}
		}
		while (s.size() > 0)
			n.push(s.pop());
		return n.toArray();
	}

	/**
	 * 计算
	 * 
	 * @param f
	 * @return
	 */
	public static double jisuan(Object[] f) {
		Stack<Object> s = new Stack<Object>();
		for (int i = 0; i < f.length; i++) {
			if (f[i] instanceof Double) {
				s.push(f[i]);
			} else if ("+".equals(f[i])) {
				double left = (double) s.pop();
				double right = (double) s.pop();
				s.push(jia(right, left));
			} else if ("-".equals(f[i])) {
				double left = (double) s.pop();
				double right = (double) s.pop();
				s.push(jian(right, left));
			} else if ("*".equals(f[i])) {
				double left = (double) s.pop();
				double right = (double) s.pop();
				s.push(cheng(right, left));
			} else if ("/".equals(f[i])) {
				double left = (double) s.pop();
				double right = (double) s.pop();
				s.push(chu(right, left));
			} else {

			}
		}
		return (double) s.pop();
	}

	public static double jia(double a, double b) {
		return a + b;
	}

	public static double jian(double a, double b) {
		return a - b;
	}

	public static double cheng(double a, double b) {
		return a * b;
	}

	public static double chu(double a, double b) {
		return a / b;
	}
}
0
1
分享到:
评论

相关推荐

    java栈实现计算器中缀表达式

    java数字栈和符号栈模拟计算器(中缀表达式) “计算中缀表达式”可以称得上是一个特别经典的关于栈的算法...中缀表达式、后缀表达式等概念在这里就不赘述了,让我们直奔主题。 题目:输入一个中缀表达式,计算其结果。

    中缀表达式转后缀表达式并计算java

    将一个表达式转为后缀表达式,用堆栈计算 中缀转后缀的过程中遇到数字直接输出,遇到符号则判断优先级。

    编译原理中缀转后缀表达式(递归下降及出错提示)

    一个编译原理中缀转后缀表达式(递归下降翻译成AST,后序遍历得到后缀)的 Java 程序,读取文件中的中缀表达式(每个表达式以分号结束,文件中可以有多个表达式)并转换为等价的后缀表达式后输出到屏幕上, 表达式中...

    java 计算器 四则运算 后缀表达式

    计算器的实现 算法题 逆波兰表达式实现优先级判断

    Calculator:通过将中缀表示法转换为后缀来计算算术表达式

    计算器算术评估程序在此程序中,用户将能够输入算术表达式并将该表达式转换为不同的符号并对其进行评估。 在算术表达式中,只允许 (,)、+、-、* 和 / 符号和数字。 将中缀和前缀表达式转换为后缀表达式。 检查算术...

    中缀表达式转换java源代码

    将简单中缀算术表达式变换成: (1)后缀形式 (2)生成书上描述的抽象堆栈机的代码 (3)对常量算术表达式,输出结果

    ExpressionParser:算术表达式的解析器和树表示

    算术表达式的解析器和树表示 该程序将递归树表示形式用于算术表达式(复合模式)。 它从输入中读取此类表达式并对其进行解析,就像编程语言的编译器一样。 解析器通过递归下降操作。 一旦存储在树表示中,就可以对...

    javascript中解析四则运算表达式的算法和示例

    也就是我们最常用的算术表达式,中缀表达式对于人类来说比较容易理解,但是不易于计算机解析。 逆波兰表示法(Reverse Polish notation,RPN,或逆波兰记法),是一种是由波兰数学家扬·武卡谢维奇1920年引入的数学...

    Arithmetic-Expression-Interpreter:实现了递归下降解析器,以将数学表达式转换为树表示形式(中缀,前缀和后缀)。 使用访问者模式来评估表达式的值

    算术口译员 CS5321数据库实践简介 •开发了递归下降解析器,将数学表达式转换为树表示形式(中缀,前缀和后缀) •编码逻辑以遍历树的中缀...•实现了访问者模式,以将树转换为前缀/后缀中的链表,并评估了表达式的值

    正则表达式30分钟入门教程

    如果能使用算术比较的话,或许能简单地解决这个问题,但是正则表达式中并不提供关于数学的任何功能,所以只能使用冗长的分组,选择,字符类来描述一个正确的IP地址:((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|...

    Java实验报告(5).doc

    使用堆栈,将中缀算术表达式转换成后缀表达式。 a) 表达式中只有+、-、×,/,%,(,)六种运算符 b) 变量名为以英文字母开头的字母数字串 c) 表达式中可以出现不带符号的常数 d) 适当判断表达式中的语法错误 e)...

    FunWithStacks

    FunWithStacks 这个项目是一项任务。 它测试了我编写程序的能力,该程序使用堆栈的概念来分析带有以下运算符(+、-、*、/... 最后,对后缀表达式进行了分析。 这是使用适当的运算符计算操作数的地方。 堆栈仍在使用中。

    计算机程序设计的要点与规范分析-.docx

    2.3 掌握C语言的自增和自减运算符要点 在C语言表达式中,如果出现自增或自减运算符,一般比拟容易改变表达式中变量值,或者弄错其值的计算。主要的改变如下: 如果是前缀自增或自减,就是运算符在使用前自动增加或...

    freemarker总结

    这里所说的空值,实际上也包括那些并不存在的变量,对于一个Java的 null值而言,我们认为这个变量是存在的,只是它的值为null,但对于FreeMarker模板而言,它无法理解null值,null值和不存在的变 量完全相同. 为了处理缺失...

    infixOperations:评估中缀操作

    它使用基于下面优先级表的递归方法,评估堆栈中的值,直到找到后缀输出表达式。 该程序接受所有运算符,包括任何长度的数字和负数。 Priority Table for evaluation Precedence Level || Operator(s) 1 Lowest ...

    C++大学教程,一本适合初学者的入门教材(part2)

    4.7 实例研究:用数组计算平均值、中数和模 4.8 查找数组:线性查找与折半查找 4.9 多下标数组 4.10 有关对象的思考:确定类的行为 小结 术语 自测练习 自测练习答案 练习 递归练习 第5章 指针与字符串 5.1 ...

    C++大学教程,一本适合初学者的入门教材(part1)

    4.7 实例研究:用数组计算平均值、中数和模 4.8 查找数组:线性查找与折半查找 4.9 多下标数组 4.10 有关对象的思考:确定类的行为 小结 术语 自测练习 自测练习答案 练习 递归练习 第5章 指针与字符串 5.1 ...

    PHP基础教程 是一个比较有价值的PHP新手教程!

    传统上网页的交互作用是通过CGI来实现的。CGI程序的伸缩性不很理想,因为它为每一个正在运行的CGI程序开一个独立进程。解决方法就是将经常用来编写CGI程序的语言的解释器编译进你的web服务器(比如mod_perl,JSP)。PHP...

Global site tag (gtag.js) - Google Analytics