表达式计算


  1 #include<iostream>
2 #include<string>
3 #include<cstdlib>
4 #include<cstring>
5 #include<iomanip>
6 #include<stack>
7 using namespace std;
8
9 #define OK 0
10 #define ERROR -1
11 #define OVERFLOW -1
12 #define OPSETSIZE 7
13 typedef int Status;
14
15 unsigned char Prior[7][7] = { // 表3.1 算符间的优先关系
16 ‘>‘,‘>‘,‘<‘,‘<‘,‘<‘,‘>‘,‘>‘,
17 ‘>‘,‘>‘,‘<‘,‘<‘,‘<‘,‘>‘,‘>‘,
18 ‘>‘,‘>‘,‘>‘,‘>‘,‘<‘,‘>‘,‘>‘,
19 ‘>‘,‘>‘,‘>‘,‘>‘,‘<‘,‘>‘,‘>‘,
20 ‘<‘,‘<‘,‘<‘,‘<‘,‘<‘,‘=‘,‘ ‘,
21 ‘>‘,‘>‘,‘>‘,‘>‘,‘ ‘,‘>‘,‘>‘,
22 ‘<‘,‘<‘,‘<‘,‘<‘,‘<‘,‘ ‘,‘=‘
23 };
24 float Operate(float a, unsigned char theta, float b);
25 char OPSET[OPSETSIZE]={‘+‘ , ‘-‘ , ‘*‘ , ‘/‘ ,‘(‘ , ‘)‘ , ‘#‘};
26 Status In(char Test,char* TestOp);
27 char precede(char Aop, char Bop);
28
29 float EvaluateExpression(string MyExp) { // 算法3.4
30 // 算术表达式求值的算符优先算法。
31 // 设OPTR和OPND分别为运算符栈和运算数栈,OP为运算符集合。
32 stack <char> OPTR; // 运算符栈,字符元素
33 stack <double> OPND; // 运算数栈,实数元素
34 char TempData[20];
35 float Data,a,b,r;
36 char theta,Dr[2];
37 char c;
38 int i=0;
39 OPTR.push(‘#‘);
40 c=MyExp[0];
41 strcpy(TempData,"\0");
42 while (c!= ‘#‘ || OPTR.top()!= ‘#‘) {
43 if (!In(c, OPSET)) {
44 Dr[0]=c;
45 Dr[1]=‘\0‘;
46 strcat(TempData,Dr);
47 c=MyExp[++i];
48 if(In(c,OPSET)) {
49 Data=(float)atof(TempData);
50 OPND.push(Data);
51 strcpy(TempData,"\0");
52 }
53 } else { // 不是运算符则进栈
54 switch (precede(OPTR.top(), c)) {
55 case ‘<‘: // 栈顶元素优先权低
56 OPTR.push(c);
57 c=MyExp[++i];
58 break;
59 case ‘=‘: // 脱括号并接收下一字符
60 OPTR.pop();
61 c=MyExp[++i];
62 break;
63 case ‘>‘: // 退栈并将运算结果入栈
64 theta=OPTR.top();
65 OPTR.pop();
66 b=OPND.top();
67 OPND.pop();
68 a=OPND.top();
69 OPND.pop();
70 OPND.push(Operate(a, theta, b));
71 break;
72 } // switch
73 }
74 } // while
75 return OPND.top();
76 } // EvaluateExpression
77
78 float Operate(float a,unsigned char theta, float b) {
79 switch(theta) {
80 case ‘+‘: return a+b;
81 case ‘-‘: return a-b;
82 case ‘*‘: return a*b;
83 case ‘/‘: return a/b;
84 default : return 0;
85 }
86 }
87
88 Status In(char Test,char* TestOp) {
89 bool Find=false;
90 for (int i=0; i< OPSETSIZE; i++) {
91 if (Test == TestOp[i]) Find= true;
92 }
93 return Find;
94 }
95
96
97 int ReturnOpOrd(char op,char* TestOp) {
98 int i;
99 for(i=0; i< OPSETSIZE; i++) {
100 if (op == TestOp[i]) return i;
101 }
102 return 0;
103 }
104
105 char precede(char Aop, char Bop) {
106 return Prior[ReturnOpOrd(Aop,OPSET)][ReturnOpOrd(Bop,OPSET)];
107 }
108
109 int main()
110 {
111 string Exp;
112 int t;
113 double result;
114 cin>>t;
115 while(t--){
116 cin>>Exp;
117 result=EvaluateExpression(Exp);
118 cout<<fixed<<setprecision(4)<<result<<endl;
119 }
120 return 0;
121 }

表达式计算,布布扣,bubuko.com

时间: 2024-08-04 10:17:07

表达式计算的相关文章

C# - 二叉树表达式计算

很早以前就写过双栈的表达式计算. 这次因为想深入学一下二叉树,网上都是些老掉牙的关于二叉树的基本操作. 感觉如果就学那些概念,没意思也不好记忆.于是动手写了一个表达式计算的应用例子. 这样学习印象才深嘛. 我喜欢逆过来贴代码~ 这是运行结果: cal() 是节点类里的计算方法,从根节点调用,递归所有子节点进行计算.Left,Right分别是左右子节点. 1 public double cal() 2 { 3 if (this.isDig==false) 4 { 5 return CAL(Fuha

Vs2013在Linux开发中的应用(26):表达式计算

快乐虾 http://blog.csdn.net/lights_joy/ 欢迎转载,但请保留作者信息 当VS调试时将鼠标移到一个变量上面的时候,VS将显示这个变量的值,实际上这个时候VS进行了表达式的计算,我们所需要做的,就是把这个过程转换为gdb的命令: Operation Description -enable-pretty-printing enable Python-based pretty-printing -var-create create a variable object -v

HDU 2424-Gary&#39;s Calculator(表达式计算+大数)

Gary's Calculator Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 950    Accepted Submission(s): 209 Problem Description Gary has finally decided to find a calculator to avoid making simple cal

C++实现 逆波兰表达式计算问题

C++实现 逆波兰表达式计算问题 #include <iostream> #include <string> using namespace std; class Stack { private: int size; int top; float *listArray; public: Stack(int sz=20); ~Stack(); bool push(float it);//入栈 bool pop(float& it);//出栈 bool isEmpty();//

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

代码: 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.

C#动态表达式计算

应该有不少人开发过程中遇到过这样的需求,我们直接看图说话: 如上图所示,其中Entity为实体类,其中包括五个属性,该五个属性的值分别来自于数据库查询结果: 用户通过可视化界面进行某些条件的配置以及某些算法的配置并自动生成表达式或者生成数学模型: 程序中需要通过生成的表达式以及动态从数据库中获取的数据进行算法映射以及自动计算出结果. 该需求这边可以举出几个应用场景: 1.报表设计器 我们可以通过报表设计器设计数据库的映射关系并配置数据之间的算法关系,然后动态生成报表: 2.某些采集工具 定向采集

蓝桥杯 算法训练 ALGO-156 表达式计算

算法训练 表达式计算 时间限制:1.0s   内存限制:256.0MB 问题描述 输入一个只包含加减乖除和括号的合法表达式,求表达式的值.其中除表示整除. 输入格式 输入一行,包含一个表达式. 输出格式 输出这个表达式的值. 样例输入 1-2+3*(4-5) 样例输出 -4 数据规模和约定 表达式长度不超过100,表达式运算合法且运算过程都在int内进行. 题目解析: 运算优先级: 括号 → 乘除 → 加减 例如 1-2+3*(4-5) (1)计算(4-5),表达式变为  1-2+3*-1 (2

表达式计算系列【未完】

P1040 表达式计算 时间: 1000ms / 空间: 131072KiB / Java类名: Main 描述 给出一个表达式,其中运算符仅包含+,要求求出表达式的最终值 输入格式 仅一行,即为表达式 输出格式 仅一行,既为表达式算出的结果 测试样例1 输入 1+1 输出 2 备注 表达式总长度<=1500 1 #include <iostream> 2 #include <string> 3 using namespace std; 4 5 string ans(1501

中缀表达式检测并转换后缀表达式,计算后缀表达式的结果

实现代码如下 #include <iostream> #include <stack> #include <ctype.h> using namespace std; //这里的数字只能是一位 //扫描表达式是否合法,合法返回0,否则返回非0 int Scanner(const char *str) { stack<char*> s; if(str==NULL) { return -1; } char *p=(char*)str; while(*p!='\0