简单的表达式计算 c++

 1 #include<iostream>
 2 #include<stack>
 3 #include<string>
 4 #include<vector>
 5 #include<map>
 6 #include<algorithm>
 7 using namespace std;
 8
 9 map<const char, int> priority;//用map来储存运算符的优先级
10
11 int compare(char a, char b){
12     int cmp = 0;
13     if(b==‘)‘ && a==‘(‘) cmp = 0;
14     else if(a==‘(‘) cmp = -1;
15     else if(priority[a] < priority[b]) cmp = -1;
16     else if(priority[a] >= priority[b]) cmp = 1;
17     return cmp;
18 }
19
20 int cal(int a, int b, char op){
21     int ans;
22     if(op==‘+‘) ans = a+b;
23     else if(op==‘-‘) ans = a-b;
24     else if(op==‘*‘) ans = a*b;
25     else if(op==‘/‘) ans = a/b;
26     return ans;
27 }
28
29 int calculator(){
30     //根据优先级的关系,可以把他们的优先级定义为下面的形式
31     //个别运算符的优先级是与位置前后有关系的,需要特俗处理
32     priority[‘#‘] = -1;
33     priority[‘)‘] = 0;
34     priority[‘+‘] = 1;
35     priority[‘-‘] = 1;
36     priority[‘*‘] = 2;
37     priority[‘/‘] = 2;
38     priority[‘(‘] = 3;
39     cout<<"please input valid expression, enter to terminate..."<<endl;
40     char ch = getchar();
41     stack<char> op;
42     stack<int> nums;
43     op.push(‘#‘);
44     nums.push(0);
45     bool flag = true;
46     while(ch!=‘#‘ || op.top()!=‘#‘){
47         if(ch<=‘9‘ && ch>=‘0‘){
48             int number = 0;
49             while(ch>=‘0‘ && ch<=‘9‘){//连续出现的数字看做一个整体
50                 number = number*10 + (ch-‘0‘);
51                 ch = getchar();
52             }
53         //    cout<<"number: "<<number<<endl;
54         //    cout<<"op: "<<ch<<endl;
55             nums.push(number);
56             flag = true;
57         }else{//比较栈顶运算符和新输出运算符的优先级
58             int cmp = compare(op.top(), ch);
59             //cout<<"compare("<<op.top()<<","<<ch<<") = "<<cmp<<endl;
60             if(cmp==-1){//顶部优先级低时,把新的运算符压栈
61                 op.push(ch);
62                 flag = false;
63                 ch = getchar();
64             }else if(cmp==0){//即栈顶和新的运算符是‘(‘和‘)‘,需要把‘(‘弹出
65                 op.pop();
66                 ch = getchar();
67             }else if(cmp==1){//栈顶运算符优先级高的时候,就要进行运算
68                 int num1, num2, tempans;
69                 char tempop;//一定要注意num的顺序,否则会导致错误的运算结果
70                 num2 = nums.top();
71                 nums.pop();
72                 num1 = nums.top();
73                 nums.pop();
74                 tempop = op.top();
75                 op.pop();
76                 tempans = cal(num1, num2, tempop);
77                 //cout<<"tempans: "<<tempans<<endl;
78                 nums.push(tempans);
79             }
80             if(ch==‘-‘ && !flag) nums.push(0);
81
82         }
83     }
84     cin.get();
85     return nums.top();
86 }
87 int main(){
88     int i = 10;
89     while(i--){
90         cout<<calculator()<<endl;
91     }
92 return 0;}

这个程序没有检错功能

输入只能包含0-9,+,-,*,/,(,),#;

#只能出现在表达式尾部表示输入结束

保证你的表达式语法正确

下面是一些例子

原文地址:https://www.cnblogs.com/mr-stn/p/9017273.html

时间: 2024-10-09 17:11:38

简单的表达式计算 c++的相关文章

java stack实现的中缀简单四则运算表达式计算

public abstract class Stack<T> { public abstract boolean isEmpty(); public abstract boolean isFull(); public abstract T top(); public abstract boolean push(T x); public abstract T pop(); public abstract void clear(); } public class SeqStack<T>

华为上机练习题--简单加减表达式计算

题目: 通过键盘输入100以内正整数的加.减运算式,请编写一个程序输出运算结果字符串. 输入字符串的格式为:"操作数1 运算符 操作数2","操作数"与"运算符"之间以一个空格隔开. 补充说明: 1.操作数为正整数,不需要考虑计算结果溢出的情况. 2.若输入算式格式错误,输出结果为"0". 要求实现函数: void arithmetic(const char *pInputStr, long lInputLen, char *

C# - 二叉树表达式计算

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

编译器--简单数学表达式计算器

做了一个能够计算简单数学表达式值的小计算器,算不上是编译器,但用到了编译器的知识.最近在看一些编译器的东西,所以动手写这个最简单的计算器,既是对那些抽象的编译器知识有个形象的认识,也为后面添加复杂的东西--语句打下基础.此计算器是以<编译原理与实践>中实现的tiny编译器为参考写的,tiny是一个值得去研究的编译器,可以说是麻雀虽小,五脏俱全.从词法分析到代码生成都有,并且代码非常清晰易懂.我觉得想要了解编译器,可以从tiny入手,去将它跑起来并分析.废话不多说,开始记录这个小计算器. 先说下

PHP 实现字符串表达式计算

什么是字符串表达式?即,将我们常见的表达式文本写到了字符串中,如:"$age >= 20",$age 的值是动态的整型变量. 什么是字符串表达式计算?即,我们需要一段程序来执行动态的表达式,如给定一个含表达式的字符串变量并计算其结果,而表达式字符串是动态的,比如为客户A执行的表达式是 $orderCount >= 10,而为客户B执行的表达式是 $orderTotal >= 1000. 场景在哪儿?同一份程序具有完全通用性,但差异就其中一个表达式而已,那么我们需要将其

表达式计算

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 OPSETSI

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();//