说明:Stack,和StirngStack,是工具类,协助编程
convertPRN是将中缀表达式转为后缀表达式
RPN是计算后缀表达式的值
1 statck接口
package DataStruct.Stack;
public interface Stack {
public void push(Object k);
public Object pop();
public boolean isEmpty();
public boolean isFull();
public Object peek();
}
2 StringStack类
package DataStruct.Stack.Sample;
import DataStruct.Stack.*;
public class StringStack implements Stack {
private String[] s;
private int top;
private int MAX;
public StringStack(int MAX) {
this.MAX = MAX;
s = new String[MAX];
top = -1;
}
public boolean isEmpty() {
return (top == -1);
}
public boolean isFull() {
return (top == MAX - 1);
}
public void push(Object k) {
s[++top] = k.toString();
}
public Object pop() {
return (Object) s[top--];
}
public Object peek() {
return (Object) s[top];
}
}
3 RPN类 用来计算后缀表达式的值
/*
* 计算RPN表示式的值
* RPN即为:逆波兰表达式reverse polish notation
* RPN rpn=new RPN("AB+C*");
* RPN rpn=new RPN("9 8 + 2 *");
*/
package DataStruct.Stack.Sample;
import DataStruct.Stack.*;
public class RPN {
private String express;
public RPN(String express) {
this.express = express;
}
public int count() {
int result = 0;// 存放最终结果
int tr = 0;// 临时结果
Stack stack = new StringStack(100);// 构造一个栈
String[] s_array = express.split(" ");
String temp = null;
int p = 0;
int q = 0;
for (int i = 0; i < s_array.length; i++) {
temp = s_array[i].toString();
// 如果是运算符计算
if (temp.equals("*") || temp.equals("/") || temp.equals("+")
|| temp.equals("-")) {
p = Integer.parseInt(stack.pop().toString());
q = Integer.parseInt(stack.pop().toString());
char t = temp.charAt(0);
switch (t) {
case '*':
tr = p * q;
stack.push(String.valueOf(tr));
break;
case '.':
tr = p / q;
stack.push(String.valueOf(tr));
break;
case '+':
tr = p + q;
stack.push(String.valueOf(tr));
break;
case '-':
tr = p - q;
stack.push(String.valueOf(tr));
break;
}
}
// 否则入栈
else
stack.push(temp);
}
int r = Integer.parseInt(stack.pop().toString());
return r;
}
public static void main(String[] args) {
RPN rpn = new RPN("9 8 + 2 *");
int r = rpn.count();
System.out.println(r);
}
}
4 convertRPN 将中缀表达式转换为后缀表达式
/*
* 将中缀表达式转成RPN
* 将(9+8)*2转为"9 8 + 2 *"
*/
package DataStruct.Stack.Sample;
import DataStruct.Stack.*;
public class ConvertRPN {
private String express;
private StringBuffer sb;
public ConvertRPN(String express) {
this.express = express;
sb = new StringBuffer();
}
// 将中缀转换成后缀
public String convert() {
Stack s = new StringStack(100);
String temp = null;//
String[] ee = express.split(" ");
// 从左到右扫描字符串
for (int i = 0; i < ee.length; i++) {
temp = ee[i];
// 如果为操作符
if (temp.equals("*") || temp.equals("/") || temp.equals("+")
|| temp.equals("-") || temp.equals("(") || temp.equals(")")) {
char c = temp.charAt(0);
switch (c) {
//如果是')'则将栈的内容弹出附加到表达式中,直到遇到'('为止,并将'('弹出
case ')':
while (!s.peek().equals("(")) {
addResult(s.pop());
}
s.pop();
break;
//如果是运算符,
//如果栈不为空,并栈顶内容不为'(',则比较该运算符和栈顶运算符的优先级,如果大于直接入栈,否则先取栈顶内容,再入栈。
//否则,直接将运算符入栈
case '+':
case '-':
case '*':
case '/':
if (!s.isEmpty() && !s.peek().equals("(")) {
if (compare(c, s.peek().toString().charAt(0))) {
s.push(temp);
} else {
addResult(s.pop());
s.push(temp);
}
} else
s.push(temp);
break;
//如果运算符为‘(’,直接入栈
case '(':
s.push(temp);
break;
}
}
// 如果是数值则直接放入到表达式中
else {
addResult(temp);
}
}
//最后将栈中的运算符依次附加在表达式后
while (!s.isEmpty()) {
addResult(s.pop());
}
return new String(sb);
}
// 将对象追加到表示式中
private void addResult(Object o) {
sb.append(o);
sb.append(" ");
}
// 比较运算符的优先级,如果小于等于则返回false,
// 如果大于则返回true;
private boolean compare(char a, char b) {
if (a == '*' || a == '/') {
if (b == '+' || b == '-')
return true;
}
return false;
}
public static void main(String[] args) {
ConvertRPN c = new ConvertRPN("( 9 - 3 ) * ( 2 - 1 )");
System.out.println(c.convert());
}
}
分享到:
相关推荐
在计算机科学领域,编写能够解析并执行四则运算表达式的程序是一项基础且重要的任务。这类程序通常称为表达式解析器,它可以将人类可读的数学表达式转换为计算机可执行的指令。本篇文章将深入探讨一个用C#语言实现的...
在IT领域,四则运算表达式的转换和计算是计算机科学中的基本问题,特别是在编译原理、数据结构和算法设计中。这里我们主要讨论如何将中缀表达式转换为后缀表达式(也称为逆波兰表示法)以及如何计算后缀表达式的结果...
四则运算表达式计算器是一种能够处理加法、减法、乘法和除法的计算工具。在编程领域,实现这样的计算器通常涉及到解析表达式、计算数值以及处理可能的错误情况等多个方面。以下是对这个主题的详细说明: 1. **...
四则运算表达式求值算法是计算机科学中的基础概念,它涉及到解析和计算数学中的加法、减法、乘法和除法操作。这篇文章将深入探讨如何在C++中实现一个四则运算表达式求值的算法。 首先,我们需要理解表达式的解析...
用栈来对一位数的四则运算表达式计算结果。 本文主要讲解如何使用栈来计算一位数的四则运算表达式的结果。栈是一种数据结构,通过使用栈,可以实现对表达式的计算。下面将详细讲解栈的使用、创建、进栈和出栈等操作...
c++程序求解简单的四则运算表达式
按中缀形式输入一个四则运算的表达式,利用算法优选算法把其转换为后缀表达式输出,并求表达式的值。假设输入的表达式中的操作数都是1位整数。
输入一个字符串形式的四则运算表达式,如"1.0+2.1*(3+4)" 直接谈出结果,输入在文件底部,自己写的。思路是先把中缀表达式转成后缀表达式,然后根据后缀表达式建立一个栈求出结果
输入一个四则运算表达式,本程序可计算出结果。另外还支持三角函数,对数运算,支持简单命令,如查看帮助和退出。输入help可查看详细情况。
博主于16年4.19去面腾讯实习生,其中一个问题是让写一个函数求四则运算表达式的值,输入是字符串,输出为表达式结果。当时只记得这是数据结构里堆栈的应用,表达式要变顺序,但是实现就想不起来了,自然程序写的...
四则运算表达式处理的栈实现,有详细注释,支持表达式预处理与合法性检查,供C++数据结构课程学习与交流使用。
设计模式在四则运算表达式中的应用 本文将探讨设计模式在四则运算表达式中的应用,设计一个完成数学运算的计算器,计算器要实现四则运算、三角运算、倒数、乘方/开方这些基本运算,并使用抽象语法树显示计算的过程...
实现的词法分析程序的功能是,接受一个表达式,输出该表达式中的各类单词符号。测试词法分析程序时,可以按照一定格式输出各类单词符号。 单词符号的种类和所属类型可定义如下 typedef enum Symbol { ERR = -1, END,...
在IT领域,四则运算表达式求值是一个基础但重要的概念,它涉及到计算机科学中的算法设计和编程语言处理。在日常编程中,我们经常需要计算包含加法(+)、减法(-)、乘法(*)和除法(/)的数学表达式。这些表达式...
本文将深入解析一个程序,该程序能够处理逆波兰表示法(也称为后缀表示法)的四则运算表达式,包括构建表达式树、输出表达式树的不同遍历方式以及最终删除表达式树。 #### 主要功能 1. **逆波兰表示法输入的算术...
任务1:如何输入一个简单的多位数(包含小数)四则运算表达式并输出 //分离一个多位操作数调用函数getValue()完成 学生分组讨论、编程实现 */ //计算多位整数四则运算表达式的值 "100.5+200.5-300.5" //定义...