Hello,大家好!
我是蒟亦先生!
温馨提示:请各位奆奆们洁身自好,请勿COPY!
相关题目:
说实话,这道题连本人都觉得非常恶心......
思路
简单来说,这道题就是输入一个中缀表达式,让你求它的值
没别的,先将中缀转后缀,再将后缀表达式计算并输出即可
(详情参考后缀表达式求值)
代码实现
#include <bits/stdc++.h> #define d double using namespace std; bool jj(char c) { return c == '+' || c == '-'; } bool cc(char c) { return c == '*' || c == '/'; } string shorten(string m) { stack<char> s; string b; int i; char w; for (i = 0; i < m.size(); i++) { if (isdigit(m[i]) || m[i] == '.') { while (isdigit(m[i]) || m[i] == '.') { b += m[i++]; } i--; b += '#'; } else if (jj(m[i])) { while (s.size() && (jj(s.top()) || cc(s.top()))) { b += s.top(); s.pop(); } s.push(m[i]); } else if (m[i] == ')') { while (s.top() != '(') { b += s.top(); s.pop(); } s.pop(); } else if (cc(m[i])) { while (s.size() && cc(s.top())) { b += s.top(); s.pop(); } s.push(m[i]); } else { s.push(m[i]); } } while (s.size()) { b += s.top(); s.pop(); } return b; } d sj(int n) { d res = 1; for (int i = 0; i < n; i++) { res *= 10; } return res; } d sb(string s) { d res = 0; char c; int dec = 0; for (int i = 1; i <= s.size(); i++) { c = s[i - 1]; if (c == '.') { dec = i; } else if (!dec) { res = res * 10 + c - '0'; } else { res += (c - '0') / sj(i - dec); } } return res; } d nb(string s) { d res, t; stack<d> num; string temp; int i; for (i = 0; i < s.size(); i++) { temp = ""; if (isdigit(s[i]) || s[i] == '.') { while (isdigit(s[i]) || s[i] == '.') { temp += s[i++]; } num.push(sb(temp)); } else { switch (s[i]) { case '+': t = num.top(); num.pop(); t += num.top(); num.pop(); num.push(t); break; case '-': t = num.top(); num.pop(); t = num.top() - t; num.pop(); num.push(t); break; case '*': t = num.top(); num.pop(); t *= num.top(); num.pop(); num.push(t); break; case '/': t = num.top(); num.pop(); t = num.top() / t; num.pop(); num.push(t); break; } } } res = num.top(); return res; } int main() { string a, b; cin >> a; b = shorten(a); cout << nb(b); return 0; }
谢谢各位奆奆!
题解制作不易,望能用心思考
如有疑问,欢迎提出问题一起讨论!