访问次数:

基于栈的中缀算术表达式求值 | Wenji's blog
头部背景图片
WenJi's blog |
WenJi's blog |

基于栈的中缀算术表达式求值

描述
输入一个中缀算术表达式,求解表达式的值。运算符包括+、-、*、/、(、)、=,参加运算的数为double类型且为正数。(要求:直接针对中缀算术表达式进行计算,不能转换为后缀或前缀表达式再进行计算,只考虑二元运算即可。)

输入
多组数据,每组数据一行,对应一个算术表达式,每个表达式均以“=”结尾。当表达式只有一个“=”时,输入结束。参加运算的数为double类型。

输出
对于每组数据输出一行,为表达式的运算结果。输出保留两位小数。

样例输入1 复制
2+2=
20*(4.5-3)=
=
样例输出1
4.00
30.00

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#define MAXSIZE 100
#define OK 1
using namespace std;
typedef struct
{
char *base;
char *top;
int stacksize;
}CharStack;//运算符
typedef struct
{
double *base;
double *top;
int stacksize;
}NumStack;//数字
bool InitStack(CharStack &S)
{
S.base=new char[MAXSIZE];
S.top=S.base;
S.stacksize=MAXSIZE;
return OK;
}
bool InitStack(NumStack &S)
{
S.base=new double[MAXSIZE];
S.top=S.base;
S.stacksize=MAXSIZE;
return OK;
}
bool Push(CharStack &S,char e)
{
*S.top++=e;
return OK;
}
bool Push(NumStack &S,double e)
{
*S.top++=e;
return OK;
}
bool Pop(CharStack &S)
{
--S.top;
return OK;
}
bool Pop(NumStack &S)
{
--S.top;
return OK;
}
char GetTop(CharStack &S)
{
return *(S.top-1); //顺序表中的可以进行加减来移位
}
double GetTop(NumStack &S)
{
return *(S.top-1);
}
char Precede(char a,char b)
{
if((a=='('&&b==')')||(a=='='&&b=='='))
return '=';
else if(a=='('||a=='='||b=='('||((a=='+'||a=='-')&&(b=='*'||b=='/')))
return '<';
else
return '>';
}
double Fun(double a,double b,char oper)
{
if(oper=='+')
return b+a;
else if(oper=='-')
return b-a;
else if(oper=='*')
return b*a;
else if(oper=='/')
return b/a;
}
int main()
{
char s[100];
while(1)
{
cin>>s;
if(s[0]=='=')
break;
NumStack SNum;//数字栈
CharStack SChar;//运算符栈
InitStack(SNum);
InitStack(SChar);
Push(SChar,'=');//表达式结束符为'=',所以压进去,为了之后与表达式的'='进行比较来清空SChar
int flag=0;
int x=0;
int e=0;//记录小数点的位置,数位
double y=0;
double a,b;//弹出的两个数字
double c;//c为a和b得出
char oper;//弹出的运算符
for(int i=0;s[i]!='\0';i++)
{
if(s[i]>='0'&&s[i]<='9')
{
flag=1;
x=x*10+s[i]-'0';
if(e)
{
e*=10;
}
}
else if(s[i]=='.')
{
e=1;
}
else
{
if(flag)
{
if(e)
y=x*1.0/e;
else
y=x*1.0;
Push(SNum,y);
x=0;
e=0;
flag=0;
}
while(1)
{
if(Precede(GetTop(SChar),s[i])=='<')
{
Push(SChar,s[i]);
break;
}
else if(Precede(GetTop(SChar),s[i])=='>')
{
a=GetTop(SNum);
Pop(SNum);
b=GetTop(SNum);
Pop(SNum);
oper=GetTop(SChar);
Pop(SChar);
c=Fun(a,b,oper);
Push(SNum,c);
}
else
{
Pop(SChar);
break;
}
}
}
}
printf("%.2f\n",GetTop(SNum));
}
return 0;
}