#include<iostream> #include<string> #include<cstring> #include<iomanip> using namespace std; typedef struct StackNode *LStack; /* 两个栈,一个是字符,一个是数字, 先判断是什么字符,然后调用不同的函数 */ typedef struct Data { double number; char op; }; struct StackNode { Data data; LStack next; }; double Function(double a, double b, char op) { if (op == '+') return a + b; else if (op == '-') return b - a; else if (op == '*') return b * a; else if (op == '/') return b / a; } char Judge(char a, char b) { if ((a == '('&&b == ')') || (a == '='&&b == '='))//a\b都为等号? return '='; else if (a == '(' || a == '=' || b == '(' || (a == '+' || a == '-') && (b == '*' || b == '/')) return '<'; else return '>'; } void InitStack(LStack &s) { s = NULL; } void Creat1(LStack &s, double a)//数字 { LStack p = new StackNode; p->data.number = a; p->next = s; s = p; } void Creat2(LStack &s, char a)//op { LStack p = new StackNode; p->data.op = a; p->next = s; s = p; } void Pop(LStack &s) { LStack q; q = s; s = s->next; delete q; } double GetTop1(LStack &s)//number取栈顶元素 { return s->data.number; } char GetTop2(LStack &s)//op { return s->data.op; } int main() { string c; double y; while (1) { cin >> c; if (c[0] == '=') break; LStack s1, s2; InitStack(s1);//数字 InitStack(s2);//运算符 Creat2(s2, '='); int x = 0, e = 0, flag = 0;//?? for (int i = 0; i < c.size(); i++) { if (c[i] >= '0' && c[i] <= '9')//还要考虑有小数点呢 { flag = 1; x = x * 10 + c[i] - '0'; if (e) { e *= 10; } } else if (c[i] == '.') { e = 1; } else { if (flag) { if (e) { y = x * 1.0 / e; } else y = x * 1.0; Creat1(s1, y); x = 0; e = 0; flag = 0; } while (1) { if (Judge(GetTop2(s2), c[i]) == '<') { Creat2(s2, c[i]); break; } else if (Judge(GetTop2(s2), c[i]) == '>') { double a, b; a = GetTop1(s1); Pop(s1); b = GetTop1(s1); Pop(s1); char op; op = GetTop2(s2); Pop(s2); y = Function(a, b, op); Creat1(s1, y); } else { Pop(s2); break; } } } } cout << setiosflags(ios::fixed) << setprecision(2); cout << s1->data.number << endl; } return 0; }
有一些不明白的:有小数点的部分没看明白呢。。