package com.ysb;
import java.util.Stack;
/**
* @param args
* 输入:一串字符串 输出:运算结果,不考虑非法输入,暂时不考虑括号 算法流程: 1.读取1个操作数 压入操作数栈 operand1
* 2.读取1个操作符 压入操作符栈 3.读取下1个操作数 压入操作数栈 operand2 4.读取下1个操作符 operator2
* 5.操作符栈出栈得到operator1 判断operator2和operato1的优先级 a. operator2优先级 >
* operator1优先级
* 读取下1个操作数operand3,operand2,operator2出栈,将operand3和operand2使用operator2计算得到结果压入操作数栈
* 回到2循环 b. operator2优先级 <= operato1优先级 操作数栈出栈2个 使用Operator1计算 压入栈
* 回到1
*
* 5+3*3*3
*/
public class Test1 {
// 操作数栈
Stack<Float> operandStack = new Stack<Float>();
// 操作符栈
Stack<String> operatorStack = new Stack<String>();
public static void main(String[] args) {
new Test1().run();
}
public void run() {
StringBuilder inputString = new StringBuilder("1*2+3-4*5/2");
int index = 0;
float operandInStack = 0;
float operandInString = 0;
String operatorInStack = "";
String operatorInString = "";
operandInStack = getOperand(inputString, index++);
operandStack.push(operandInStack);
operatorInStack = getOperator(inputString, index++);
operatorStack .push(operatorInStack);
while (true) {
operandInString = getOperand(inputString, index++);
if(inputString.length() == 0) {
operandStack.push(operandInString);
while(true) {
float operandStack2 = operandStack.pop();
operandInStack = operandStack.pop();
operatorInStack = operatorStack.pop();
float result = compute(operandInStack, operandStack2,
operatorInStack);
operandStack.push(result);
if(operandStack.size() == 1)
break;
}
break;
}
operatorInString = getOperator(inputString, index++);
operatorInStack = operatorStack.pop();
if (getOperatorLevel(operatorInString) > getOperatorLevel(operatorInStack)) {
operandStack.push(operandInString);
operatorStack.push(operatorInStack);
operatorStack.push(operatorInString);
continue;
} else {
operandInStack = operandStack.pop();
float result = compute(operandInStack, operandInString,
operatorInStack);
operandStack.push(result);
operatorStack.push(operatorInString);
if (inputString.length() == 0)
break;
else
continue;
}
}
System.out.println(operandStack.pop());
}
/*
* 操作数栈 操作符栈 1+2*3*4*5+6
* 1
*
* 2 +
* 6 +
*/
/**
* 从指定的index处获取1个操作数
*
* @param inputString
* @return 操作数
*/
public float getOperand(StringBuilder inputString, int index) {
float f = Float.parseFloat(inputString.substring(0,1));
inputString = inputString.delete(0,1);
return f;
}
/**
* 从指定的index处获取1个操作符
*
* @return 操作符
*/
public String getOperator(StringBuilder inputString, int index) {
String operator = inputString.substring(0,1);
inputString = inputString.delete(0,1);
return operator;
}
/**
* @param operator
* 操作符
* @return 操作符的优先级
*/
public int getOperatorLevel(String operator) {
if (operator.equals("+") || operator.equals("-"))
return 1;
else if (operator.equals("*") || operator.equals("/"))
return 2;
else
return 3;
}
public float compute(float operand1, float operand2, String operator) {
if (operator.equals("+"))
return operand1 + operand2;
else if (operator.equals("-"))
return operand1 - operand2;
else if (operator.equals("*"))
return operand1 * operand2;
else if (operator.equals("/"))
return operand1 / operand2;
return 0;
}
}
运行结果
-5.0
分享到:
相关推荐
在这个过程里,我们将详细探讨如何将中缀表达式转换为后缀表达式,并利用栈结构来计算表达式的值。 首先,让我们理解中缀转后缀的转换规则。这个过程通常通过两个主要步骤完成:扫描和输出。我们遍历中缀表达式的每...
通过学习和理解这个项目,不仅可以掌握中缀转后缀和后缀求值的基本算法,还能深入理解数据结构(如栈)在算法中的应用,以及如何处理浮点数和负数的计算问题。这对于提升C语言编程能力,特别是算法设计和实现能力是...
理解这些规则对于正确计算表达式至关重要。例如,"2 + 3 * 4"的正确求值应该是14,而不是20,因为乘法优先于加法。 在易语言表达式求值过程中,"IsEmpty"函数用于检查一个数据结构(如数组、列表或堆栈)是否为空。...
后缀表达式的一大优点是可以通过简单的栈操作计算表达式值。遍历后缀表达式,每遇到一个操作数,将其压入栈;遇到运算符时,弹出栈顶的两个操作数,进行运算,并将结果压回栈。这样,最后栈中的唯一元素就是整个...
本主题聚焦于如何利用正则式来计算表达式的值,通过提供的源码文件`Calculate.java`,我们可以深入理解这个过程。 首先,让我们探讨正则表达式的基础。正则表达式是由字符、元字符和运算符组成的模式,可以用来匹配...
4. **后缀表达式求值**:一旦得到后缀表达式,就可以进行计算了。遍历后缀表达式,将遇到的每个数字压入栈中,遇到运算符时,弹出栈顶的两个数字进行运算,然后将结果压回栈中。最后,栈中剩余的唯一元素即为表达式...
它涉及到如何解析并计算由数字和运算符组成的数学表达式的值。例如,对于表达式 `3 * (9 - 7) =`,其结果为 `6`。此类问题不仅在编程竞赛中常见,在实际应用中也十分广泛,如计算器应用程序、编译器设计等。 #### ...
2. **后缀表达式求值**:在得到后缀表达式后,我们可以用一个简单的栈来计算其值。从左到右扫描后缀表达式,遇到数字时压入栈,遇到运算符时弹出栈顶的两个操作数进行计算,然后将结果压回栈。最后,栈中剩下的唯一...
在计算机科学中,算术表达式求值是一个基础但重要的任务,它涉及到解析、处理和计算包含运算符和操作数的数学表达式。本主题主要关注如何使用C语言实现一个算术表达式求值器,这通常涉及到栈数据结构的应用。 栈是...
总之,这个简单的表达式求值器涉及到了计算理论的基础知识,包括词法分析、语法分析和计算过程。它是一个很好的学习项目,可以帮助初学者理解编译器设计的基本原理。同时,对于有经验的开发者来说,这样的小工具也是...
这篇实验报告主要探讨了如何利用栈来实现算术表达式的求值,这对于初学者理解程序设计语言中的表达式计算机制非常有帮助。报告中提到,表达式计算是程序设计语言的基础,而这个问题可以通过将数学表达式转化为后缀...
《Siliphen的表达式求值实践工程代码》是一个关于计算机科学中表达式求值的实践项目,这个项目深入探讨了如何在编程中实现表达式的计算。表达式求值是计算机科学的基础,尤其是在编译原理、解释器设计以及计算理论等...
后缀表达式是一种易于计算的表达式形式,它的运算符优先级和结合性规则更加简单。 在Java中,实现中缀表达式求值的步骤可以分为以下几步: 1. 将中缀表达式解析成一个个的操作数和运算符。 2. 使用一个栈来存储...
在Python编程语言中,表达式求值是一项基本且重要的任务,它涉及到将字符串形式的数学或逻辑表达式转换为实际的计算结果。本教程将深入探讨如何使用Python来实现表达式求值,特别是通过五行代码的简洁实现,以及相关...
后序遍历常用于计算表达式,因为它能确保所有子节点在运算符之前被处理。对于"(a + b) * c",后序遍历顺序为"a b + c *"。 这个“简单LISP算术表达式计算器”很可能采用了类似LISP语言的解析和求值机制。LISP(List...
“求值”是指计算表达式并得出其结果的过程。在C++中,实现表达式求值通常涉及以下几个步骤: 1. **输入解析**:程序首先需要读取用户输入的表达式,例如"3 + 4 / 4 + 9 * 2"。由于表达式是以空格分隔的,因此可以...
本文将深入探讨C++语言中如何实现一个简单的表达式求值器,主要关注其核心算法和数据结构的应用。 C++表达式求值通常涉及将数学表达式转换为计算机可以理解和执行的形式。在给出的代码示例中,我们看到一个名为`...
在计算机科学中,表达式求值是计算编程语言中的一个基本概念,它涉及将符号表达式转化为实际值的过程。本文将深入探讨如何使用.NET框架、MFC(Microsoft Foundation Classes)以及VC++(Visual C++)来构建一个...
栈的应用广泛,其中之一就是用于解决算术表达式的求值问题。本文将深入探讨如何利用栈来实现一个算术表达式求值的程序。 首先,我们要理解算术表达式的构成。一个基本的算术表达式可能包含数字、运算符(如加号"+...
这样可以准确地按照运算规则计算表达式。 在这个VC++实现的计算器程序中,可能采用了类似深度优先求值的方法,因为这样才能正确处理具有不同优先级的运算符。程序可能会包含以下几个关键部分: - **词法分析**:将...