今天刷刷我们学校的OJ。看到了那道我们大家都熟悉的表达式求值题目。去网上搜了下,发现没有现成可用的好的算法。于是自己花了点时间写了个。没有做过多优化,先发出来再说。
1
#include<stdio.h>
2
#include<string.h>
3
#include<stack>
4
using namespace std;
5
6
char exp[1100];
7
char num[100];//此数组用来把字符数字转化为整数
8
9
stack<char> cstack;
10
stack<double> nstack;
11
12
int n;
13
14
int convert(int length)
15

{
16
int value = 0;
17
for(int i = 0;i < length;++i)
18
{
19
value = value * 10 + num[i]-'0';
20
}
21
return value;
22
}
23
24
//判断a运算符比b优先。如果是的话,那么返回1如果不是的话,返回0
25
int order(char a ,char b)
26

{
27
if(a == '*' || a == '/')
28
{
29
return 1;
30
}
31
if(a == '+' || a == '-')
32
{
33
if(b == '*' || b== '/')
34
return 0;
35
else
36
return 1;
37
}
38
return 0;
39
}
40
41
//这个函数用来判断字符是数字还是运算符
42
43
int judge(char c)
44

{
45
if(c <= '9' && c >= '0')
46
return 1;
47
else
48
return 0;
49
}
50
51
52
double go(char c,double n1,double n2)
53

{
54
if(c == '+')
55
return n1 + n2;
56
else
57
if(c == '-')
58
return n1 - n2;
59
else
60
if(c == '*')
61
return n1 * n2;
62
else
63
if(c == '/')
64
return n1 / n2;
65
return 0;
66
}
67
68
int ignoreKuohao(stack<char> &ccstack,stack<double>& nnstack)
69

{
70
while(!ccstack.empty() && ccstack.top()!='(')
71
{
72
char c1 = ccstack.top(); ccstack.pop();
73
double n1 = nnstack.top(); nnstack.pop();
74
double n2 = nnstack.top(); nnstack.pop();
75
if(ccstack.empty())
76
{
77
nnstack.push(go(c1,n1,n2));
78
break;
79
}
80
else
81
{
82
char c2 = ccstack.top(); ccstack.pop();
83
if(order(c1,c2))
84
{
85
double k = go(c1,n1,n2);
86
ccstack.push(c2);
87
nnstack.push(k);
88
}
89
else
90
{
91
//nnstack.push(n1);
92
double n3 = nnstack.top();nnstack.pop();
93
double k = go(c2,n2,n3);
94
nnstack.push(k);
95
96
k = nnstack.top();
97
nnstack.push(n1);
98
99
k = nnstack.top();
100
ccstack.push(c1);
101
}
102
}
103
}
104
if(!ccstack.empty() && ccstack.top() == '(')
105
{
106
ccstack.pop();
107
}
108
109
return 0;
110
}
111
112
113
114
//事实证明,在没有括号的情况下,应该从前往后进行计算
115
void inKuohao()
116

{
117
char c = cstack.top();
118
stack<char> ccstack;
119
stack<double> nnstack;
120
//把括号内的表达式逆过来
121
int n = nstack.top();
122
nnstack.push(n);
123
nstack.pop();
124
while(c != '(')
125
{
126
cstack.pop();
127
ccstack.push(c);
128
129
nnstack.push(nstack.top());
130
nstack.pop();
131
if(cstack.empty())
132
break;
133
c = cstack.top();
134
}
135
if(!cstack.empty())
136
{
137
cstack.pop();
138
}
139
ignoreKuohao(ccstack,nnstack);
140
nstack.push(nnstack.top());
141
nnstack.pop();
142
}
143
144
int calc(int j)
145

{
146
int i = 0;
147
int length = 0;
148
// stack<char> cstack;
149
// stack<int> nstack;
150
for(i = 0;i <= j ;++i )
151
{
152
if(judge(exp[i]))
153
{
154
num[length ++ ] = exp[i];
155
}
156
else
157
{
158
if(judge(exp[ i - 1]))//如果上一个是数字的话,就入栈.这个判断是为了防止出现(2 + 1 )/2。这种情况
159
{
160
int k = convert(length);
161
nstack.push(k);
162
length = 0;
163
}
164
if(exp[i] == ')')
165
{
166
inKuohao();
167
}
168
else
169
if(exp[i] == '#')
170
break;
171
else
172
cstack.push(exp[i]);
173
}
174
}
175
if(!cstack.empty())
176
{
177
inKuohao();
178
}
179
int k =(int) nstack.top();
180
printf("%d\n",k);
181
return k;
182
}
183
184
int main()
185

{
186
scanf("%s",exp);
187
int j = strlen(exp);
188
exp[j] = '#';
189
exp[j + 1] = '\0';
190
calc(j);
191
return 0;
192
}
193
posted on 2011-04-24 21:00
崔佳星 阅读(278)
评论(0) 编辑 收藏 引用 所属分类:
数据结构和算法