精华内容
下载资源
问答
  • 计算表达式的值

    2015-01-23 12:37:01
     简单来讲计算表达式的值可以通过计算表达式的后缀表达式的值来计算(注:我们通常讲的表达式都是中序表达式)  举例说明: A+B-C*D 这是我们要计算的表达式,我们知道*比+/-的优先级高,但是计算机并不能智能...

      这应该是属于数据结构入门的部分,我大一的时候就应该写过,现在重新看数据结构,我决定在实现一遍

    (这里 讨论的表达式只包含加减乘除     小括号)

      简单来讲计算表达式的值可以通过计算表达式的后缀表达式的值来计算(注:我们通常讲的表达式都是中序表达式)

     举例说明:  A+B-C*D   这是我们要计算的表达式,我们知道*比+/-的优先级高,但是计算机并不能智能的识别并处理,所以我们需要告诉计算机这样的规则

    其中一种做法就是将中序表达式转化成后序表达式  之前式子的后序表达式为 AB+CD*-,对于计算机来说他读到符号只需要入栈,读到符号只需要出栈2个数值,根据符号计算然后入栈数值就行了。


    接下来是分析如何从中序转化成后序表达式,

    1我们观察单一优先级的运算符

    A-B+C    AB-C+

    A*B/C    AB*C/

    我们可以得知如果存在同意优先级的运算符连续连接多个数我们需要在读到第二个运算符时把之前的运算符输出(这样是保证了式子的从左到右的计算顺序)


    2我们观察混合运算符

    A+B*C     ABC*+

    A/B-C      AB/C-

    我们可以知道高优先级运算符会抢先于低优先级的运算符的执行,所以当我们读到低优先级的选算符必须把高优先级的运算符全部输出,

    其实换个说法更好理解,我们可以把混合运算符连接的式子 高优先级运算符连接的部分看成一个整体 比如 A+B*C  -》   A+(B*C)   我们对于高优先级的式子先计算是为了得出低优先级运算符的一个操作元,最后把式子转化成一个低优先级的运算符


    3小括号

    直接把小括号里的式子当做一个新的式子处理,处理的结果当做一个操作元



    根据之前的观察结果 我们可以知道这样的转化规则,我们在处理中序表达式的时候,如果读到一个数,我们就直接输出,如果我们读到一个运算符,我们需要cache下来,并且把优先级不低于他的运算符全部输出,遇到小括号的时候,我们读入左括号,把括号内的式子按照正常处理,在读入右括号的时候 我们需要左括号内cache的符号依次输出,比如(A-B*C)


    接下来放我写的demo,最近感冒 脑子有点不清楚,程序的冗余比较多,也可能存在一部分bug,不过我测试的几个案例都过了,如果程序有错请联系我。

    程序是直接得到式子的结果,如果需要得到后序表达式 照着我上面说的思路改一改就可以了

    import java.util.ArrayList;
    
    //把只包含加减乘除和小括号以及操作元是正数的正确算数表达式以后缀表达式为中介计算求值
    public class MidtoPost {
    	public static void main(String[] args) throws Exception {
            System.out.println(MidtoPost.GetResult("20+"));
    	}
    
    	public MidtoPost() {
    	}
    
    	// 用一个栈结构存储中介值,也用一个栈存储算数符号
    	// 遇到一个数值先压栈,遇到一个算数符号,我把所有的优先级不低于于他的算数符号出栈,同时出栈2个数值,将计算结果出栈。
    
    	private static int pointer;// 只想当前正在处理的字符的位置
    	private static ArrayList<Double> NumStack = new ArrayList<Double>();
    	private static ArrayList<Character> MarkStack=new ArrayList<Character>();
    	private static char[] polo;
    	private static int size;
    
    	public static Double GetResult(String poloy){
    		polo = poloy.toCharArray();
    		size = poloy.length();
    
    		NumStack.clear();
    		MarkStack.clear();
    
    		double result = 0;
    		double cache2 = 0;
    		double cache1 = 0;
    		boolean condition = false;
    		try {
    			while (pointer < size) {
    				switch (polo[pointer]) {
    				// 遇到 +/- 将 乘除号弹出
    				case '+':
    				case '-':
    					condition = true;
    					while (condition && MarkStack.size() > 0) {
    						char tempMark = MarkStack.remove(MarkStack.size() - 1);
    						switch (tempMark) {
    						case '+':
    							cache2 = NumStack.remove(NumStack.size() - 1);
    							cache1 = NumStack.remove(NumStack.size() - 1);
    							NumStack.add(cache1 + cache2);
    							break;
    						case '-':
    							cache2 = NumStack.remove(NumStack.size() - 1);
    							cache1 = NumStack.remove(NumStack.size() - 1);
    							NumStack.add(cache1 - cache2);
    							break;
    						case '*':
    							cache2 = NumStack.remove(NumStack.size() - 1);
    							cache1 = NumStack.remove(NumStack.size() - 1);
    							NumStack.add(cache1 * cache2);
    							break;
    						case '/':
    							cache2 = NumStack.remove(NumStack.size() - 1);
    							cache1 = NumStack.remove(NumStack.size() - 1);
    							NumStack.add(cache1 / cache2);
    							break;
    						default:
    							MarkStack.add(tempMark);
    							condition = false;
    							break;
    						}
    					}
    					MarkStack.add(polo[pointer]);
    					pointer++;
    					break;
    				case '*':
    				case '/':
    					condition = true;
    					while (condition && MarkStack.size() > 0) {
    						char tempMark = MarkStack.remove(MarkStack.size() - 1);
    						switch (tempMark) {
    						case '*':
    							cache2 = NumStack.remove(NumStack.size() - 1);
    							cache1 = NumStack.remove(NumStack.size() - 1);
    							NumStack.add(cache1 * cache2);
    							break;
    						case '/':
    							cache2 = NumStack.remove(NumStack.size() - 1);
    							cache1 = NumStack.remove(NumStack.size() - 1);
    							NumStack.add(cache1 / cache2);
    							break;
    						default:
    							MarkStack.add(tempMark);
    							condition = false;
    							break;
    						}
    					}
    					MarkStack.add(polo[pointer]);
    					pointer++;
    					break;
    				case '(':
    					MarkStack.add('(');
    					pointer++;
    					break;
    				case ')':
    					char tempchar = MarkStack.remove(MarkStack.size() - 1);
    					while (tempchar != '(') {
    						switch (tempchar) {
    						case '+':
    							cache2 = NumStack.remove(NumStack.size() - 1);
    							cache1 = NumStack.remove(NumStack.size() - 1);
    							NumStack.add(cache1 + cache2);
    							break;
    						case '-':
    							cache2 = NumStack.remove(NumStack.size() - 1);
    							cache1 = NumStack.remove(NumStack.size() - 1);
    							NumStack.add(cache1 - cache2);
    							break;
    						case '*':
    							cache2 = NumStack.remove(NumStack.size() - 1);
    							cache1 = NumStack.remove(NumStack.size() - 1);
    							NumStack.add(cache1 * cache2);
    							break;
    						case '/':
    							cache2 = NumStack.remove(NumStack.size() - 1);
    							cache1 = NumStack.remove(NumStack.size() - 1);
    							NumStack.add(cache1 / cache2);
    							break;
    						default:
    							break;
    						}
    						tempchar = MarkStack.remove(MarkStack.size() - 1);
    					}
    					pointer++;
    					break;
    				default:
    					NumStack.add(GetNextNum());
    					break;
    				}
    			}
    			ClearMark();
    			return NumStack.get(0);
    		} catch (Exception e) {
    			System.err.println("表达式错误");
    		}
    		return Double.MAX_VALUE;
    	}
    
    	// 用来式子结束之后对符号栈进行清空操作
    	private static void ClearMark() throws Exception {
    		double cache1 = 0;
    		double cache2 = 0;
    		while (MarkStack.size() > 0) {
    			char tempchar = MarkStack.remove(MarkStack.size() - 1);
    			switch (tempchar) {
    			case '+':
    				cache2 = NumStack.remove(NumStack.size() - 1);
    				cache1 = NumStack.remove(NumStack.size() - 1);
    				NumStack.add(cache1 + cache2);
    				break;
    			case '-':
    				cache2 = NumStack.remove(NumStack.size() - 1);
    				cache1 = NumStack.remove(NumStack.size() - 1);
    				NumStack.add(cache1 - cache2);
    				break;
    			case '*':
    				cache2 = NumStack.remove(NumStack.size() - 1);
    				cache1 = NumStack.remove(NumStack.size() - 1);
    				NumStack.add(cache1 * cache2);
    				break;
    			case '/':
    				cache2 = NumStack.remove(NumStack.size() - 1);
    				cache1 = NumStack.remove(NumStack.size() - 1);
    				NumStack.add(cache1 / cache2);
    				break;
    			default:
    				throw new Exception("illegal mark");
    			}
    		}
    	}
    
    	// 获取下一个数值
    	private static Double GetNextNum() throws Exception {
    		if (pointer >= size) {
    			throw new Exception("out of border");
    		}
    		StringBuffer sb = new StringBuffer();
    		boolean condition = true;
    		while (condition) {
    			sb.append(polo[pointer]);
    			pointer++;
    			if (pointer >= size) {
    				return Double.parseDouble(sb.toString());
    			}
    			switch (polo[pointer]) {
    			case '+':
    			case '-':
    			case '*':
    			case '/':
    			case '(':
    			case ')':
    				condition = false;
    				break;
    			default:
    				break;
    			}
    		}
    
    		return Double.parseDouble(sb.toString());
    	}
    
    }
    



    展开全文
  • 山东大学 数据结构实验 计算表达式的值 堆栈
  • authorware制品:计算表达式的值。authorware制品:计算表达式的值
  • 利用数栈和操作符栈,由中缀直接计算表达式的值
  • 未能计算表达式的值

    2019-07-16 14:27:29
    调试问题的时候,监视不管用,不论什么监视值都是:未能计算表达式的值,这尼玛要急死人。 1. 项目是debug的啊,代码应该没有任何优化才对啊。之前还能调试来着。 2. 代码明显没有问题,即便是有问题也有异常捕捉。...

    不知道为什么,越是上线,越是莫名其妙的出很多问题

    环境:vs2013

    调试问题的时候,监视不管用,不论什么监视值都是:未能计算表达式的值,这尼玛要急死人。

    1. 项目是debug的啊,代码应该没有任何优化才对啊。之前还能调试来着。

    2. 代码明显没有问题,即便是有问题也有异常捕捉。显然也不是代码的问题

    3. 查了查也没有具体尝试,但是从各种现象上分析,应该是环境中出了什么问题,尼玛肯定重启下iis就可以了。

     

    重启iis, ok。求解为什么会出此问题。问题原因在哪里。解决方法。

    转载于:https://www.cnblogs.com/superCow/p/3881091.html

    展开全文
  • Java语言高分悬赏:借助2个堆栈,实现java语言输入表达式自动计算表达式的值
  • 2696:计算表达式的值 总时间限制: 1000ms 内存限制: 65536kB 描述 有些语言中表达式的运算符使用字符串表示,例如用mul代表*,用div代表/,用add代表+,用sub代表-,用mod代表%。 输入 第一行为表达式的个数n。其余n...

    2696:计算表达式的值
    总时间限制: 1000ms 内存限制: 65536kB
    描述
    有些语言中表达式的运算符使用字符串表示,例如用mul代表*,用div代表/,用add代表+,用sub代表-,用mod代表%。
    输入
    第一行为表达式的个数n。其余n行每行一个表达式,表达式由两个整数及其中间的运算符字符串表示。
    输出
    输出为n行,每行是对应表达式的值。注意,此处要求的所有运算均为整数运算。
    样例输入
    5
    345 mul 122
    3945 div 12
    321 add 343
    340 sub 211
    377 mod 27
    样例输出
    42090
    328
    664
    129
    26
    来源
    计算概论05

    问题链接Bailian2696 计算表达式的值
    问题简述:(略)
    问题分析
        简单的输入输出题,用到字符串函数,不解释。
    程序说明:(略)
    参考链接:(略)
    题记:(略)

    AC的C++语言程序如下:

    /* Bailian2696 计算表达式的值 */
    
    #include <stdio.h>
    #include <string.h>
    
    char *op[] = {"mul", "div", "add", "sub", "mod"};
    char s[6];
    
    int main(void)
    {
        int n, a, b, ans;
    
        scanf("%d", &n);
        while(n--) {
            scanf("%d%s%d", &a, s, &b);
    
            if(strcmp(s, op[0]) == 0) ans = a * b;
            else if(strcmp(s, op[1]) == 0) ans = a / b;
            else if(strcmp(s, op[2]) == 0) ans = a + b;
            else if(strcmp(s, op[3]) == 0) ans = a - b;
            else if(strcmp(s, op[4]) == 0) ans = a % b;
    
            printf("%d\n", ans);
        }
    
        return 0;
    }
    
    展开全文
  • 1.计算表达式的值 设计思想:先求左子树表达式的值,再求右子树的值,最后相乘 int comp(BTNode *p) { int A,B; if(p!=NULL) { if(p-&gt;lchild!=NULL&amp;&amp;p-&gt;rchild!=NULL) { ...

    1.计算表达式的值

    设计思想:先求左子树表达式的值,再求右子树的值,最后相乘

    int comp(BTNode *p)
    {
    	int A,B;
    	if(p!=NULL)
    	{
    		if(p->lchild!=NULL&&p->rchild!=NULL)
    		{
    			A=comp(p->lchild);
    			B=comp(p->rchild);
    			return op(A,B,p->data);
    		}
    		else
    			return p->data-'0';
    	}
    	return 0;
    } 

    2.求二叉树的深度

    设计思想:左子树深度,右子树深度,判断最大+1

    int getDepth(BTNode *p)
    {
    	int LD,RD;
    	if(p==NULL)
    		return 0;
    	else
    	{
    		LD=getDepth(p->lchild);
    		RD=getDepth(p->rchild);
    		return (LD>RD?LD:RD)+1;
    	}
    }

    3.查找结点值

    void search(BTNode *p,int key)
    {
    	BTNode *q;
    	if(p!=NULL)
    	{
    		if(p->data==key)
    			q=p;
    		else
    		{
    			search(p->lchild,key);
    			search(p->rchild,key);
    		}
    	}
    }

     

    展开全文
  • Java实现计算表达式的值

    千次阅读 2019-12-12 11:05:20
    已知一个只含有()、+ 、-、*、\这五种操作符,数字只是整数,并且空格隔开的表达式字符串,求表达式的值。 例如: ( 3 + 4 ) * 5 - 6 结果为29 解题思路 给定表达式为中缀表达式,将其转为后缀表达式(逆波兰表达式...
  • 返回计算表达式的值

    2010-11-12 18:52:00
    //函数功能:返回计算表达式的值 //参数: string thestr 计算表达式,如 2 * (3+5) //返回值:string retVal 计算表达式的结果值,如 2 * (3+5)的结果值为 16 // 如果是一个不正确的表达式,则返回 false. //==...
  • 从键盘上输入一个后缀表达式,试编写算法计算表达式的值。规定:逆波兰表达式的长 度不超过一行,以 作为输入结束,操作数之间用空格分隔,操作符只可能有+、—、*、/四种 运算。例如: 23434 + 2$。* ...
  • Linux shell计算表达式的值

    千次阅读 2013-07-17 15:11:15
    shell比较简单也比较灵活,计算表达式的值有很多方法: 暂举一例,后续慢慢补充。  size=`hadoop dfs -dus $1 | awk -F" " '{print $2}'`;  num=`expr $size / $block`;
  • 计算表达式的值 题目描述: 请计算表达式“(-8+22)×a-10+c÷2”,其中,a = 40,c = 212。 输入描述: 无。 输出描述: (-8+22)×a-10+c÷2计算之后的结果,为一个整数。 代码实现: public class Main { ...
  • C#中计算表达式的值

    2017-11-12 15:55:00
    今天在论坛里面逛发现一个问题比较典型,我们在使用js的时候可以直接使用Eval得到某一个表达式的值,在C#里面可以吗?答案是肯定的,在.NET提供的丰富的类库里面这是可以实现的,但是没有js那么简单下面我将使用一个...
  • 1013 - 计算表达式的值

    2018-10-13 20:30:43
    题目描述 ... “(”,“)”,“0~9”,“+”,“-”,“*”...输入的表达式都是合法的,这个表达式的值就是密码。小明数学学得不好,还需你帮他的忙。 输入格式 输入一行字符串,为一个算术表达式。 输出格式 输...
  • 利用栈计算表达式的值

    千次阅读 2016-04-01 00:11:50
    假设算术表达式只包含”+”、“-”、“*”、“/”、正整数和括号合法数学表达式,求算术表达式值。 过程是:先将算术表达式转换成后缀表达式(逆波兰式),然后对该后缀表达式。  1)将算术表达式exp转换成...
  • 数据结构里的中缀转后缀,可以输出后缀表达式,如操作数是浮点数,可以计算表达式的值
  • java中输入输入“算术表达式”的文本,如何计算表达式的值?例如输入1+2/2+2*(3+1);如何直接给出10.   方法: 在动态语言中如python,groovy中,这些根本不是问题,到java语言中,就变成了一件挺难的事。我想到几...
  • 计算表达式的值(一)

    2019-11-28 20:52:19
    1.在一个文本框中输入表达式,当该文本框失去焦点时,在另一个文本框中显示表达式的值。利用onblur和window.eval(val) <!DOCTYPE html> <html> <head> <script type="text/javascript"> ...
  • 然后往界面里面添加功能,添加完之后,编译通过了,但是在点到某一个按钮的时候,出现说:“读取位置是访问位置冲突”,通过调试,发现里面很多位置的变量显示:“cxx0030 错误 无法计算表达式的值” 解决办法: ...
  • 从键盘输入一个表达式,试编写算法计算表达式的值。 我刚开始学数据结构,发现有些东西比较有意思,写下来给大家分享下,第一次写博客,不好勿喷。 这道题目是数据结构中很基本的题目。是一个四则运算。刚开始按照...
  • 算法设计 计算表达式的值 java

    千次阅读 2018-01-17 23:46:27
    package day_19;... * 输入一个只包含加减乖除和括号的合法表达式,求表达式的值。其中除表示整除 * 目前暂不支持负数 * 留下注释,明天再写 * Created by IamZY on 2018/1/17. * * @version 1.1 */ public
  • 程序跑一段时间 就会报错 : [0] CXX0030: 错误: 无法计算表达式的值 如图看 frameid325~328的地址还在 但是内容已经没了 。 如何解决 在线等 ![图片说明]...
  • 一个表达式由数字和运算符组成,建立两个栈,一个栈用来存数,另一个栈用来存运算符,再利用栈的基本操作来实现表达式的计算#include #include #define OK 1 #define ERROR -1 #define MAX_SIZE 30 typedef int ...
  • 表达式由一个或者几个数字或者变量和运算符组合成的一行代码通常会返回一个结果运算符由一个以上的值经过变化得到新值的过程就叫做运算用于运算的符号称为运算符运算符的分类:算数运算符比较或者关系运算符赋值...
  • 假设算术表达式只包含”+”、“-”、“*”、“/”、正整数和括号的合法数学表达式,求算术表达式。过程是利用了先将算术表达式(中缀...(一)具体的中缀表达式转换成后缀表达式的法则:1.遇到操作数直接输出 2.若遇

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 18,592
精华内容 7,436
关键字:

计算表达式的值