最近由于一项需求,需要用户自己来组合表达式,然后做运算,对于计算机处理数学计算,一般是先将中缀表达式,也就是我们平常见到的数学表达式转化为后缀表达式,
如 (2+3)*6 转换成 2 3 + 6 *,
后缀表达式中,是不含有括号的,计算机在运算的时候,从左向右读取,若遇到运算符,则取运算符左边的两个操作数来计算,并将计算结果作为下一次计算的一个操作数。
下面分享一个用JAVA实现的中缀转后缀并实现后缀表达式合法性的验证
/**
* 中缀表达式转后缀表达式
*
* @param formula
* 中缀表达式
* @return 后缀表达式
*/
public static String midToBehind(String formula) {
String S = ""; // 后缀
StringTokenizer st1 = new StringTokenizer(formula);
String[] Operators = new String[st1.countTokens()];
int Top = -1;
while (st1.hasMoreTokens()) {
String C = st1.nextToken();
;
switch (C.charAt(0)) {
case ' ':
break;
case '+': // 操作符
case '>':
case '<':
case '-':
while (Top >= 0) // 栈不为空时
{
String c = Operators[Top--]; // pop Operator
if (c.equals("(")) {
Operators[++Top] = c; // push Operator
break;
} else {
S = S + c;
}
}
Operators[++Top] = C; // push Operator
S += " ";
break;
case '*': // 操作符
case '/':
while (Top >= 0) // 栈不为空时
{
String c = Operators[Top--]; // pop Operator
if (c.equals("(")) {
Operators[++Top] = c; // push Operator
break;
} else {
if (c.equals("+") || c.equals("-")) {
Operators[++Top] = c; // push Operator
break;
} else {
S = S + c;
}
}
}
Operators[++Top] = C; // push Operator
S += " ";
break;
case '(': // 操作符
Operators[++Top] = C;
S += " ";
break;
case ')': // 操作符
while (Top >= 0) // 栈不为空时
{
String c = Operators[Top--]; // pop Operator
if (c.equals("(")) {
break;
} else {
S = S + c;
}
}
S += " ";
break;
default: // 操作数
S = S + C + " ";
break;
}
}
while (Top >= 0) {
S = S + Operators[Top--]; // pop Operator
}
System.out.println(S); // 后缀
return S;
}
/**
* 检查后缀表达式是否正确
*
* @param lpszParse
* 后缀表达式
* @return true 合法 false 不合法
*/
public static boolean checkBehind(String lpszParse) {
int Otp = -1;
boolean returnFlag = true;
if (lpszParse != null) {
// 后缀表达式不含有括号
if (lpszParse.contains("(") || lpszParse.contains(")")) {
return false;
}
// 分割表达式
StringTokenizer st1 = new StringTokenizer(lpszParse);
String[] Operands = new String[st1.countTokens()];
while (st1.hasMoreTokens()) {
String s = st1.nextToken();
switch (s.charAt(0)) {
case ' ':
case '+':
case '-':
case '*':
case '/':
case '>':
case '<':
// 如果为运算符,刚将操作数出栈,如果小于两个操作数,则不正确
if (Otp < 1) {
returnFlag = false;
} else {
// 若存在两个操作数,则将两个操作数出栈
String o1 = Operands[Otp--];
String o2 = Operands[Otp--];
// 将运算结果做为一个操作数,入栈,供下一次运算
Operands[++Otp] = o1 + "&" + o2;
}
break;
default:
// 若为操作数,则入栈
Operands[++Otp] = s;
}
// 如果存在不合法,跳出循环
if (!returnFlag) {
break;
}
}
// 运算完成,栈内应该只剩最后一次运算的结果
if (--Otp >= 0) {
returnFlag = false;
}
}
// 检测结果近回
return returnFlag;
}
分享到:
相关推荐
c语言实现中缀表达式转后缀表达式并求得计算结果,用顺序栈结构。 当输入者输入错误信息的时候需要报错,并说明错误的种类。
利用C语言实现中缀表达式转化为后缀表达式!!利用栈。
编译系统对中缀表达式的处理方法是先把它转换为后后缀表达式.在后缀表达式中,运算符位于两个操作数的后面,并且没有括号,其运算符的次序就是其执行运算的次序。后缀表达式计算过程的规则非常简单:从左到右依次扫描,...
在计算机科学中,数据...总结来说,中缀表达式转后缀表达式是数据结构和算法中的一个经典问题,主要利用堆栈数据结构和运算符优先级规则。在C++中实现这一转换,可以提高计算效率,便于计算机解析和执行数学表达式。
在本实验报告中,主要涉及的是中缀表达式与后缀表达式的转换以及求值问题。中缀表达式是我们常见的运算符位于操作数之间的表达形式,例如 `6+3*(6+5)`,而后缀表达式又称逆波兰表示法,其中运算符位于其操作数之后,...
一个简单的算法,利用栈实现中缀表达式与后缀表达式的转换
用栈实现中缀表达式转为后缀表达式,规定了各个符号的优先级,可以说是对栈概念的深入理解
/*程序由本人编译,并且经过多次测试,正确无误!目前该转换算法只支持数字在0至9之间的+-*/四元运算转换.*/ /**************程序员信息 ***************东北大学*******************东大很厉害**************** ...
### C语言实现中缀表达式向后缀表达式转换 #### 概述 在计算机科学领域,表达式的处理是一项基础而重要的任务。表达式通常有三种形式:前缀(波兰)、中缀(标准数学表达式)和后缀(逆波兰)。本篇文章将详细探讨...
用户输入中缀表达式,程序输出后缀表达式并输出计算结果
总结来说,中缀表达式转后缀表达式是编译原理中的基本操作,它涉及到了栈数据结构、运算符优先级以及表达式树的构建。通过这种方法,我们可以更高效地计算和解析数学表达式,这对于计算机程序设计,尤其是编译器和...
中缀表达式、后缀表达式以及它们之间的转换是计算机科学中的一个重要概念,尤其是在编译原理和算法设计中。中缀表达式是我们日常数学运算中常见的形式,如 "2 + 3 * 4",而后缀表达式,也称为逆波兰表示法,将操作符...
中缀表达式转换为后缀表达式_C++程序设计 中缀表达式转换为后缀表达式是一个常见的数据结构和算法问题。中缀表达式是一种常见的数学表达式表示形式,例如:a \* (x + y) / (b - x),而后缀表达式是将运算符移到它的...
// 输出应该是对应的后缀表达式以及计算结果 ``` 以上代码实现了将一个包含数字和运算符的中缀表达式转换为后缀表达式,并计算了该表达式的值。通过自定义的栈来处理运算符的优先级,确保了表达式能够正确地进行...
中缀表达式转后缀表达式,并进行计算; 支持: 支持函数: Abs 绝对值 Power 幂 Sqr 平方 Sqrt 平方根 Abs Sqr Sqrt 需要加括号 Power不需要 * 后缀运算符: * 第1级: () 从左到右 * 算出运算符: * 第4级:* \ % 从...
中缀表达式就是我们通常所书写的数学表达式,后缀表达式也称为逆波兰表达式,在编译程序对我们书写的程序中的表达式进行语法检查时,往往就可以通过逆波兰表达式进行。我们所要设计并实现的程序就是将中缀表示的...
中缀表达式转后缀表达式的算法通常涉及两个主要步骤:构建二叉表达式树(也称运算符优先树)和遍历该树以生成后缀表达式。下面将详细介绍这两个步骤以及C++代码实现的关键点。 1. **构建二叉表达式树**: - 二叉...