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;
}
}
分享到:
相关推荐
### 基于栈实现算术表达式求值的原理与算法 在计算机科学领域,栈是一种非常重要的数据结构,其遵循先进后出(LIFO)原则,即最后进入的数据最先被处理。栈广泛应用于多种场景,其中之一就是利用栈来求解算术表达式...
本文将详细探讨如何利用栈数据结构来实现算术表达式的自动计算,包括两种不同的方法:中缀表达式转后缀表达式计算法以及直接使用双栈计算法。 首先,我们了解栈的基本概念。栈是一种具有“后进先出”(LIFO)性质的...
3. 实现后缀表达式求值的方法,遍历后缀表达式并进行计算。 4. 可能还包括主函数main,用于测试和展示Calculator类的功能。 总的来说,Java处理复杂表达式求值的过程涉及到数据结构(如栈)的运用,以及对运算符...
java数字栈和符号栈模拟计算器(中缀表达式) “计算中缀表达式”可以称得上是一个特别经典的关于栈的算法...中缀表达式、后缀表达式等概念在这里就不赘述了,让我们直奔主题。 题目:输入一个中缀表达式,计算其结果。
总结,Java版的算术表达式与二叉树源码实现了将算术表达式转化为二叉树结构,并提供了遍历和计算功能。这对于理解和实践数据结构,特别是二叉树的操作,具有很大的帮助。通过分析和运行这样的源码,开发者可以深入...
本文将深入探讨如何使用算符优先数算法(Operator Precedence Algorithm)来正确求值带有括号的算术表达式。这个算法是编译原理和解释器设计中的一个重要概念,它能够帮助我们理解如何通过编程实现对复杂数学表达式...
将一个表达式转为后缀表达式,用堆栈计算 中缀转后缀的过程中遇到数字直接输出,遇到符号则判断优先级。
在Java编程语言中,解析和计算算术表达式是一项常见的任务,特别是在开发涉及用户输入、数学计算或逻辑处理的应用程序时。在这个场景中,我们通常会利用数据结构,如栈(Stack),来辅助我们实现这一功能。栈是一种...
在这个项目中,我们聚焦于“算术表达式求解”,这是一个典型的数据结构应用,涉及到解析、存储和计算数学表达式。 首先,我们需要理解算术表达式的基本构成。算术表达式通常由数字、运算符(如加号"+"、减号"-"、...
在计算机科学中,后缀表达式求值是解决复杂算术表达式计算问题的有效手段。本压缩包文件提供了后缀表达式的求值工具,包括两个主要功能:runsome和runall,它们均采用Java编程语言实现,同时也涉及到Scanner和...
ExpressionJ是一个Java库,专为解析和计算数学算术表达式而设计。它允许程序员处理字符串形式的数学公式,将其转换为可执行的代码,并从中获取结果。在深入理解其源码之前,我们需要先了解一些基本概念。 1. **算术...
在本次的“算术表达式的求值数据结构课程设计”中,我们将深入探讨如何使用数据结构来解析和计算复杂的算术表达式。这个项目的主要目标是实现一个程序,该程序能够接收用户通过文本文档输入的任意算术表达式,并准确...
在计算机科学中,数据结构和算法是编程的基础,本案例聚焦于使用Java实现算术表达式求值,这是一个典型的栈应用问题。算术表达式求值涉及到中缀表达式和后缀表达式的转换以及运算符的优先级处理。 中缀表达式是我们...
在Java编程中,正则表达式(Regular Expression)是一种强大的文本处理工具,它可以用来匹配、查找、替换符合特定模式的字符串。...通过这种方式,我们可以用Java实现一个简单的算术表达式解析器。
一个编译原理中缀转后缀表达式(递归下降翻译成AST,后序遍历得到后缀)的 Java 程序,读取文件中的中缀表达式(每个表达式以分号结束,文件中可以有多个表达式)并转换为等价的后缀表达式后输出到屏幕上, 表达式中...
后缀表达式的计算方法不仅适用于简单的算术表达式,还可以扩展到更复杂的表达式,如函数调用、条件判断等。在编译原理、解释器实现、计算器程序等领域都有广泛的应用。通过理解并掌握后缀表达式及其计算方法,能帮助...
计算器的实现 算法题 逆波兰表达式实现优先级判断
而后缀表达式(也称为逆波兰表示法)是一种无需括号来确定计算顺序的表示方式,如中缀表达式“3 + 4 * 5”转换为后缀表达式后为“3 4 5 * +”。 #### 知识点二:中缀到后缀表达式的转换算法 将中缀表达式转换为...
该课程设计的目标是实现一个能处理算术表达式的系统,它能够正确识别和计算包含加、减、乘、除等基本运算符的表达式,同时处理括号以确保正确的运算顺序。系统应能处理错误情况,并给出相应的错误提示。 1.2 选题...
后缀表达式,又称逆波兰表示法,是数学和计算机科学中用于表示算术表达式的一种方式。在后缀表达式中,运算符放在它们的操作数之后,这与我们常用的中缀表达式(运算符在操作数之间)不同。这种表示法在计算和解析...