表达式计算模板

编程入门 行业动态 更新时间:2024-10-27 20:39:53

代码来自blogs./demian/p/6104625.html

可以实现+ - * / ( ) . 等运算符,表达式以字符串的形式计算,字符串中不允许有空格

//欧拉函数打表
#include<iostream>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<stack>
#pragma warning(disable:4996)
#define me(s)  memset(s,0,sizeof(s))
#define _for(i,a,b) for(int i=(a);i<(b);++i)
#define _rep(i,a,b) for(int i=(a);i<=(b);++i)
using namespace std;double toNum(char*s, int &k)
{int flag = 0;double x = 0.0, y = 0.1;while (s[k] >= '0'&&s[k] <= '9' || s[k] == '.'){if (s[k] >= '0'&&s[k] <= '9'){if (flag == 0)x = x * 10 + s[k] - '0';else{x = x + y * (s[k] - '0');y = y * 0.1;}}else{flag = 1;}k = k + 1;}return x;
}int priority(char c)
{int k;switch (c){case '*':k = 2; break;case '/':k = 2; break;case '+':k = 1; break;case '-':k = 1; break;case '(':k = 0; break;case ')':k = 0; break;default:k = -1; break;}return k;
}
void cal(char *s)
{stack<double> sv;stack<char> sp;char c;int k = 0, flag = 1;double x, y;sp.push('\0');c = s[k];while (flag){if (c >= '0'&&c <= '9' || c == '.'){sv.push(toNum(s, k));}else if (c == '\0'&& sp.top() == '\0'){flag = 0;}else if (c == '(' || (priority(c) > priority(sp.top()))){sp.push(c);k++;}else if (c == ')'&& sp.top() == '('){sp.pop();k++;}else if (priority(c) <= priority(sp.top())){x = sv.top();sv.pop();y = sv.top();sv.pop();c = sp.top();sp.pop();switch (c){case '+':y = x + y; break;case '-':y = y - x; break;case '*':y = x * y; break;case '/':y = y / x; break;}sv.push(y);}c = s[k];}cout << sv.top() << endl;
}
int main()
{char s[100 + 10];while (scanf("%s", s) == 1){cal(s);}system("pause");return 0;
}

 

更多推荐

表达式,模板

本文发布于:2023-05-29 21:32:56,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/353301.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:表达式   模板

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!