构建树并计算算术表达式(为了应付该作业,仅供参考)

只是应付数据结构老师分配。式中的号码只能是一个整数:

例如,输入 (6+3)*(4-2)*(41-1)

出口 720.00

#include <stdio.h>
#include <string.h>
const int N = 1000;
int m[N], flag;
double res;
struct Node {
	double val;
	char c;
	Node* left;
	Node* right;
	Node() {
		left = right = NULL;
		c = 'a' - 1;
	}
};

Node* build(char *str, int l, int r) {
	int flag1 = -1, flag2 = -1, p = 0;
	Node* node = new Node;
	if (r - l == 1) {
		node -> val = m[str[l]];
		return node;
	}
	for (int i = l; i < r; i++) {
		switch(str[i]) {
			case '(' : p++; break;
			case ')' : p--; break;
			case '+' :
			case '-' :
				if (!p)
					flag1 = i;
				break;
			case '*' :
			case '/' :
				if (!p)
					flag2 = i;
				break;
		}
	}
	if (flag1 < 0)
		flag1 = flag2;
	if (flag1 < 0)
		return build(str, l + 1, r - 1);
	node -> left = build(str, l, flag1);
	node -> right = build(str, flag1 + 1, r);
	node -> c = str[flag1];
	return node;
}

double preOrder(Node* root) {
	if (root == NULL)
		return 0;
	if (root -> c == 'a' - 1)
		return root -> val;
	double a;
	switch(root -> c) {
		case '+': a = preOrder(root -> left) + preOrder(root -> right);
		break;
		case '-': a = preOrder(root -> left) - preOrder(root -> right);
		break;
		case '*': a = preOrder(root -> left) * preOrder(root -> right);
		break;
		case '/':
			if (preOrder(root -> right) != 0)
				a = preOrder(root -> left) / preOrder(root -> right);
			else
				flag = 1;
		break;
	}
	return a;
}

int main() {
	Node* root;
	char str[N], s[N];
	while (scanf("%s", str) != EOF) {
		memset(m, 0, sizeof(m));
		res = flag = 0;
		int len = strlen(str);
		int n = 0;
		char a = 'a';
		if (str[0] == '-')
			s[n++] = a++;
		for (int i = 0; i < len; i++) {
			if (str[i] > '9' || str[i] < '0')
				s[n++] = str[i];
			else {
				int sum = 0;
				while (str[i] >= '0' && str[i] <= '9') {
					sum = sum * 10 + str[i] - '0';
					i++;
				}
				i--;
				m[a] = sum;
				s[n++] = a++;
			}
		}
		s[n] = '\0';
		root = build(s, 0, n);
		res = preOrder(root);
		if (!flag)
			printf("表达式结果: %.2lf\n", res);
		else
			printf("error!\n");
	}
	return 0;
}

版权声明:本文博客原创文章,博客,未经同意,不得转载。

时间: 2024-11-10 13:27:09

构建树并计算算术表达式(为了应付该作业,仅供参考)的相关文章

双栈计算算术表达式

1.介绍 算术表达式的计算,是比较常见的问题,但这个问题的背后隐藏着栈的思想. 这里就介绍使用两个栈来计算表达式的方法. 2. 算法 2.1 定义: a) 建立两个栈: 一个是数据栈dataStak,用于存放数据: 一个是符号栈operatorStack,用于存放运算符: b) 建立运算符号之间的优先级表,用于比较两个符号之间的优先级: 优先级定义为三种运算结果:>(表示高于),<(表示低于),=(表示相等): 并且对于"("与")",认为两者的优先级相

建算数表达式树并计算(应付作业,仅供参考)

只是为了应付数据结构老师布置的作业,算式里的数只能是整数: 例如输入 (6+3)*(4-2)*(41-1) 输出 720.00 #include <stdio.h> #include <string.h> const int N = 1000; int m[N], flag; double res; struct Node { double val; char c; Node* left; Node* right; Node() { left = right = NULL; c =

java实现计算算术表达式的值(后缀表达式方式)

Java代码   package zn.sd.ly.jtree.test; /** * 表达式 * * @author 风华褚胜--刘胜军 */ import java.util.Arrays; import java.util.Scanner; import java.util.Stack; public class Four { @SuppressWarnings("resource") public static void main(String[] args) { Scanne

堆栈解析算术表达式

利用栈,解析算术表达式问题就立刻变得容易许多.给出的示例代码能解析任何包括+,-,*,/,()和0到9数字组成的算术表达式. 中缀表达式和后缀表达式中缀表达式就是通常所说的算术表达式,比如(1+2)*3-4.后缀表达式是指通过解析后,运算符在运算数之后的表达式,比如上式解析成后缀表达式就是12+3*4-.这种表达式可以直接利用栈来求解. 运算符的优先级 优先级 运算符 1 括号() 2 负号- 3 乘方** 4 乘*,除/,求余% 5 加+,减- 6 小于<,小于等于<=,大于>,大于等

poj3295解题报告(构造、算术表达式运算)

POJ 3952,题目链接http://poj.org/problem?id=3295 题意: 输入由p.q.r.s.t.K.A.N.C.E共10个字母组成的逻辑表达式, 其中p.q.r.s.t的值为1(true)或0(false),即逻辑变量: K.A.N.C.E为逻辑运算符, K --> and:  x && y A --> or:  x || y N --> not :  !x C --> implies :  (!x)||y E --> equals 

【算法】E.W.Dijkstra算术表达式求值

算术表达式求值 我们要学习的一个栈的用例同时也是展示泛型的应用的一个经典例子,就是用来计算算术表达式的值,例如 ( 1 + ( ( 2 + 3 ) * ( 4 * 5 ) ) ) 如果将4乘以5,把3加上2,取它们的积然后加上1,就得到了101.但Java系统是如何完成这些运算的呢?不需要研究Java系统的构造细节,我们也可以编写一个Java程序来解决这个问题.它接受一个输入字符串(表达式)并输出表达式的值.为了简化问题,首先来看一下这份明确的递归定义:算术表达式可能是一个数,或者是由一个左括号

爪哇国新游记之二十二----算术表达式计算求值

代码: import java.util.ArrayList; import java.util.List; // 辅助类 class Item{ String value; boolean isNumber; public Item(String value,boolean isNumber){ this.value=value; this.isNumber=isNumber; } public Item(char c,boolean isNumber){ this.value=String.

算法_计算输入的算术表达式的值.

例如:如果输入:( ( 1 + 2 ) * ( 3 + ( 4 * 5 ) ) )可以计算出输入的字符串所对应的算术表达式的值.我们支持运算符+,-,*,/,和一个一元运算abs,可以用一个简单的算法获取这个算术表达式的值: 我们用两个栈(一个用于保存操作符,一个用于保存操作数).表达式由括号,运算符和操作数组成.我们按照以下四种情况对于这个实体送入栈处理: 1.将操作数压入操作数栈 2.将运算符压入运算符栈 3.忽略左括号 4.如果碰到右括号,弹出一个运算符,如果运算符是abs以外的运算符,弹

根据表达式计算算术结果

// //  main.c //  科学计算器 // //  Created by QzydeMac on 14/11/28. //  Copyright (c) 2014年 Qzy. All rights reserved. // #include <stdio.h> #include <string.h> #include <stdlib.h> typedef enum BOOL {     TRUE,     FALSE }BOOL; double add(dou