@Scarlet
2018-11-17T17:28:10.000000Z
字数 1669
阅读 1924
表达式计算
对于一个仅含四则运算的表达式,我们可以通过这样操作把它变成后缀表达式
对于一个后缀表达式,我们可以这样计算它
注意到前算法的输出队列和后算法的入栈顺序相同,那么让两个算法同时进行就是计算表达式了。
/*
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;
}
else
return *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;
else
ST[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;
else
for (tp--; tp && st[tp] != -2;)
prt(1, st[tp--]);
}
for (; tp;)
prt(1, st[--tp]);
printf("\n%lf\n", ST[0]);
return 0;
}
这也太强了吧QAQ
惊了,怕是大学里学的第一个算法= =