只写出了正负整数的加减乘除,没有设计小数的,感觉写的太复杂了,但是又没有想到更简洁的方法
- double Calculate(string &postfix)
- {
- struct
- {
- double data[MAX];
- int top;
- }
- op;//定义栈:存储可计算的数字
- int i = 0;
- char ch;
- double x;
- bool flag = false;//负数标志,值为true时为负数
- op.top = -1;
- ch = postfix[i];
- i++;
- while (ch != '/0')
- {
- switch (ch)
- {
- case '+':
- op.data[op.top-1] = op.data[op.top-1] + op.data[op.top];
- op.top--;
- break;
- case '-':
- if(postfix[i] == ' ' || postfix[i] == '/0')//为减号‘-’时压栈,为负号‘-’时,此处不处理
- {
- op.data[op.top-1] = op.data[op.top-1] - op.data[op.top];
- op.top--;
- }
- break;
- case '*':
- op.data[op.top-1] = op.data[op.top-1] * op.data[op.top];
- op.top--;
- break;
- case '/':
- if (op.data[op.top] != 0)
- {
- op.data[op.top-1] = op.data[op.top-1] / op.data[op.top];
- }
- else
- {
- cout << "The divisor is 0" << endl;
- }
- op.top--;
- break;
- case ' ':
- break;
- default ://将连续的数字字符转化为可运算的数字
- x = 0;
- flag = false;
- if (postfix[i-2] == '-')//判读是否为负数
- {
- flag = true;
- }
- while (ch >= '0' && ch <= '9')//将字符转化为可计算的数
- {
- ch = ch - '0';
- x = 10 * x + ch;
- ch = postfix[i];
- i++;
- }
- if (flag)//若为负数,则取反
- {
- x = 0 - x;
- }
- op.top++;
- op.data[op.top] = x;
- break;
- }
- ch = postfix[i];
- i++;
- }
- return op.data[op.top];
- }