@Scarlet
        
        2018-11-17T09:28:10.000000Z
        字数 1669
        阅读 2331
    表达式计算
![]()
对于一个仅含四则运算的表达式,我们可以通过这样操作把它变成后缀表达式
对于一个后缀表达式,我们可以这样计算它
注意到前算法的输出队列和后算法的入栈顺序相同,那么让两个算法同时进行就是计算表达式了。
/*Author: Scarlet*/#include <stdio.h>#include <ctype.h>#include <string.h>char ops[4] = "+-*/", S[1000];int st[1000], tp, TP;double ST[1000];int getnxt(int *x, int *i){char ch = S[*i];int _[233], __[233];_['('] = 2, _[')'] = 3, _['+'] = 4, _['-'] = 4, _['*'] = 4, _['/'] = 4;__['('] = 0, __[')'] = 0, __['+'] = 0, __['-'] = 1, __['*'] = 2, __['/'] = 3;if (isdigit(ch)){for (*x = 0; isdigit(S[*i]); ++*i)*x = *x * 10 + S[*i] - 48;return 1;}elsereturn *x = __[ch], ++*i, _[ch];}void prt(int op,int x)//后缀表达式转值{if(op==0){printf("%d ", x);ST[TP++] = (double)x;}else{printf("%c ", ops[x]);double Y = ST[TP - 1], X = ST[TP - 2];TP--;if (x == 0)ST[TP - 1] = X + Y;else if(x==1)ST[TP - 1] = X - Y;else if(x==2)ST[TP - 1] = X * Y;elseST[TP - 1] = X / Y;}}int main(){freopen("w.in", "r", stdin);scanf("%s", S);int L = strlen(S);for (int i = 0; i < L;){int x, op = getnxt(&x, &i);if (op == 1)prt(0, x);else if (op == 4){for (; tp && st[tp - 1] / 2 >= x / 2;)prt(1, st[--tp]);st[tp++] = x;}else if (op == 2)st[tp++] = -2;elsefor (tp--; tp && st[tp] != -2;)prt(1, st[tp--]);}for (; tp;)prt(1, st[--tp]);printf("\n%lf\n", ST[0]);return 0;}
这也太强了吧QAQ
惊了,怕是大学里学的第一个算法= =