后缀表达式的计算

/**
 * 后缀表达式的计算
 *
 * 使用栈来保存结果
 *
 * 1.从左向右逐一检查后缀表达式中的每一个字符
 * 2.遇到数字直接push入栈
 * 3.遇到操作符,就从栈中弹出两个数参与运算,将结果保留在栈中,如果操作符是 /,-或者^
 * 号,则后弹出的数是第一个运算数
 * 4.最后的结果保留在栈中**/
import java.util.Stack;

public class calc {
	public double calculate(String postfix){
		Stack<Double> sk=new Stack<Double>();
		char[] ch=postfix.toCharArray();
		for(int i=0;i<ch.length;i++){
			if(Character.isDigit(ch[i]))
				sk.push(Double.valueOf(String.valueOf(ch[i])));
			else
				c(sk,ch[i]);
		}
		return sk.pop();
	}
	public void c(Stack<Double> sk,Character ch){
		switch(ch+0){
		case '+'+0:
			sk.push(sk.pop()+sk.pop());
			break;
		case '-'+0:
			double tmp=sk.pop();
			sk.push(sk.pop()-tmp);
			break;
		case '*'+0:
			sk.push(sk.pop()*sk.pop());
			break;
		case '/'+0:
			double temp=sk.pop();
			sk.push(sk.pop()/temp);
			break;
		case '^'+0:
			double tp=sk.pop();
			sk.push(Math.pow(sk.pop(),tp));
			break;
		case '%'+0:
			double mp=sk.pop();
			sk.push(sk.pop()%mp);
			break;
		default :
			throw new RuntimeException();
		}
	}
}

//测试
输入  6*2+(2^2+3*2/(3-1)^2)*(3-1)
输出  23.0

时间: 2024-12-15 18:23:08

后缀表达式的计算的相关文章

运用栈把算术表达式+,-,*,/,%(中缀表达式)转换成后缀表达式并且计算出值

原理: 1.首先判断是数值还是符号,如果是数值放进字符数组以#表示结束, 2.如果是符号,放进栈, 3.每个符号之间要比较优先级,如果栈顶符号优先级低,符号进栈,如果相等(即“(” “)”)出栈,栈顶符号优先级高,栈顶元素出栈进入字符数组,得到后缀表达式 4.计算后缀表达式,判断是数字还是符号.直到遇到符号,将前面的数字计算后放进栈,一直重复,知道“\0” 代码(局限用整数,因为有模运算,若要任何类型的代码,我的blog有) 1 #include <stdio.h> 2 #include &l

栈应用 - 后缀表达式的计算

有关栈API详情參看我的还有一篇博文:栈的链式存储 - API实现 遍历后缀表达式中的数字和符号 对于数字:进栈 对于符号: 从栈中弹出右操作数 从栈中弹出左操作数 依据符号进行运算 将运算结果压入栈中 遍历结束:栈中的唯一数字为计算结果 #include <stdio.h> #include "LinkStack.h" int isNumber3(char c) { return ('0' <= c) && (c <= '9'); } int

图解后缀表达式的计算过程

为了解释后缀表达式的好处,我们先来看看,计算机如何应用后缀表达式计算出最终的结果20的. 后缀表达式:9 3 1-3*+ 10 2/+ 规则:从左到右遍历表达式的每个数字和符号,遇到是数字就进栈,遇到是符号,就将处于栈顶两个数字出栈,进行运算,运算结果进栈,一直到最终获得结果. 下面是详细的步骤: 1. 初始化一个空栈.此桟用来对要运算的数字进出使用. 2. 后缀表达式中前三个都是数字,所以9.3.1进栈. 3. 接下来是减号“-”,所以将栈中的1出栈作为减数,3出栈作为被减数,并运算3-1得到

c语言,中缀表达式转后缀表达式并计算

1 //c语言中缀表达式计算 2 #include <stdio.h> 3 #include <stdlib.h> 4 #include <string.h> 5 #include <stdbool.h> 6 #include <math.h> 7 typedef struct{ 8 char data[85]; 9 int top; 10 }stack; 11 typedef struct{ 12 int data[85]; 13 int to

Python与数据结构[1] -&gt; 栈/Stack[1] -&gt; 中缀表达式与后缀表达式的转换和计算

中缀表达式与后缀表达式的转换和计算 目录 中缀表达式转换为后缀表达式 后缀表达式的计算 1 中缀表达式转换为后缀表达式 中缀表达式转换为后缀表达式的实现方式为: 依次获取中缀表达式的元素, 若元素为操作数(数字/字母等),则加入后缀表达式中 若元素为操作符,则压入栈中,此时对比入栈操作符与栈内元素的计算等级,等级大于或等于入栈元素的栈内操作符都将被弹出栈,加入到后缀表达式中 左括号直接入栈,优先级最高,不弹出栈内元素 右括号不入栈,而是弹出所有元素加入后缀表达式,直至遇见匹配的左括号,并弹出左括

数据结构Java实现06----中缀表达式转换为后缀表达式

数据结构Java实现06----中缀表达式转换为后缀表达式 本文主要内容: 表达式的三种形式 中缀表达式与后缀表达式转换算法 一.表达式的三种形式: 中缀表达式:运算符放在两个运算对象中间,如:(2+1)*3.我们从小做数学题时,一直使用的就是中缀表达式. 后缀表达式:不包含括号,运算符放在两个运算对象的后面,所有的计算按运算符出现的顺序,严格从左向右进行(不再考虑运算符的优先规则),如:2 1 + 3 *.又比如3+(6-4/2)*5=23的后缀表达式为:3642/-5*+# (#符号为结束符

关于后缀表达式和中缀表达式的思考

众所周知啦,我们数学里面的公式就是中缀表达式(infix),形如a*(b+c),支持括号用于调整运算的顺序.我们平常用的就是中缀表达式. 那么什么是后缀表达式(postfix)? 后缀表达式(又称为逆波兰reverse polish)就是不需要括号就可以实现调整运算顺序的一种技法. 比如:ab+cde+** 上面就是一个典型的后缀表达式,将它改为中缀表达式其实是(a+b)*((d+e)*c).我们这样将后缀表达式转换成中缀表达式,虽然符合我们的数学计算习惯,但是并不符合计算机运算的方式.我们可以

自己yy的中缀表达式转后缀表达式(未验证完全正确)

目前自己测试的表达式都没有出过问题 思路是这样,先将后缀表达式的计算顺序搞出来..当完全缩出来一个数的时候,如果后面还有要计算的,我们就把它放到后缀表达式的后面 先算后面的..不断迭代.. #include <iostream> #include <cstdio> #include <cstring> using namespace std; typedef long long ll; char sign[]={'+','-','*','/','^','(',')'},

数据结构——栈——中缀表达式和后缀表达式

什么是中缀表达式,什么是后缀表达式 我们一般看见的多项式计算都是中缀表达式构成的:1+2*3+4/3 类似这种,为什么说是中缀呢?因为它的计算符号都是在两个数中间的. 那么自然而然的明白了后缀表达式是一种计算符号在两个数后面的. 如123*+43/+ 中缀表达式和后缀表达式有什么关系? 其实仔细你就会发现,上面给出的式子其实都是一样的,只是计算的顺序在后缀表达式中你看不懂而已. 因为我们习惯去看中缀表达式的计算. 其实他们之间是可以互相转换的.他们也可以表达同一个意思,同一个计算式子. 为什么会