#include "evaluation.h"
002
#include "stack.h"
003
#include <stdio.h>
004
#define NULL 0
005
//运算符之间的关系
006
// + - * / ( ) \n
007
char relation[7][7] ={
008
/* + */ {'>','>','<','<','<','>','>'},
009
/* - */ {'>','>','<','<','<','>','>'},
010
/* * */ {'>','>','>','>','<','>','>'},
011
/* / */ {'>','>','>','>','<','>','>'},
012
/* ( */ {'<','<','<','<','<','=',' '},
013
/* ) */ {'>','>','>','>',' ','>','>'},
014
/*\n*/ {'<','<','<','<','<',' ','='}
015
};
016
char OP[8] = {'+','-','*','/','(',')','\n'};
017
void menu()
018
{
019
printf("===============================\n");
020
printf(" [1]输入表达式并求值 \n");
021
printf(" [2]退出 \n");
022
printf("===============================\n");
023
}
024
char Precede(char opnd,char c)
025
{
026
int i = 0;
027
int j = 0;
028
switch(opnd)
029
{
030
case '+':
031
i = 0;
032
switch(c)
033
{
034
case '+':
035
j = 0;
036
return relation[i][j];
037
break;
038
case '-':
039
j = 1;
040
return relation[i][j];
041
break;
042
case '*':
043
j = 2;
044
return relation[i][j];
045
break;
046
case '/':
047
j = 3;
048
return relation[i][j];
049
break;
050
case '(':
051
j = 4;
052
return relation[i][j];
053
break;
054
case ')':
055
j = 5;
056
return relation[i][j];
057
break;
058
case '\n':
059
j = 6;
060
return relation[i][j];
061
break;
062
}
063
break;
064
case '-':
065
i = 1;
066
switch(c)
067
{
068
case '+':
069
j = 0;
070
return relation[i][j];
071
break;
072
case '-':
073
j = 1;
074
return relation[i][j];
075
break;
076
case '*':
077
j = 2;
078
return relation[i][j];
079
break;
080
case '/':
081
j = 3;
082
return relation[i][j];
083
break;
084
case '(':
085
j = 4;
086
return relation[i][j];
087
break;
088
case ')':
089
j = 5;
090
return relation[i][j];
091
break;
092
case '\n':
093
j = 6;
094
return relation[i][j];
095
break;
096
}
097
break;
098
case '*':
099
i = 2;
100
switch(c)
101
{
102
case '+':
103
j = 0;
104
return relation[i][j];
105
break;
106
case '-':
107
j = 1;
108
return relation[i][j];
109
break;
110
case '*':
111
j = 2;
112
return relation[i][j];
113
break;
114
case '/':
115
j = 3;
116
return relation[i][j];
117
break;
118
case '(':
119
j = 4;
120
return relation[i][j];
121
break;
122
case ')':
123
j = 5;
124
return relation[i][j];
125
break;
126
case '\n':
127
j = 6;
128
return relation[i][j];
129
break;
130
}
131
break;
132
case '/':
133
i = 3;
134
switch(c)
135
{
136
case '+':
137
j = 0;
138
return relation[i][j];
139
break;
140
case '-':
141
j = 1;
142
return relation[i][j];
143
break;
144
case '*':
145
j = 2;
146
return relation[i][j];
147
break;
148
case '/':
149
j = 3;
150
return relation[i][j];
151
break;
152
case '(':
153
j = 4;
154
return relation[i][j];
155
break;
156
case ')':
157
j = 5;
158
return relation[i][j];
159
break;
160
case '\n':
161
j = 6;
162
return relation[i][j];
163
break;
164
}
165
break;
166
case '(':
167
i = 4;
168
switch(c)
169
{
170
case '+':
171
j = 0;
172
return relation[i][j];
173
break;
174
case '-':
175
j = 1;
176
return relation[i][j];
177
break;
178
case '*':
179
j = 2;
180
return relation[i][j];
181
break;
182
case '/':
183
j = 3;
184
return relation[i][j];
185
break;
186
case '(':
187
j = 4;
188
return relation[i][j];
189
break;
190
case ')':
191
j = 5;
192
return relation[i][j];
193
break;
194
case '\n':
195
j = 6;
196
return relation[i][j];
197
break;
198
}
199
break;
200
case ')':
201
i = 5;
202
switch(c)
203
{
204
case '+':
205
j = 0;
206
return relation[i][j];
207
break;
208
case '-':
209
j = 1;
210
return relation[i][j];
211
break;
212
case '*':
213
j = 2;
214
return relation[i][j];
215
break;
216
case '/':
217
j = 3;
218
return relation[i][j];
219
break;
220
case '(':
221
j = 4;
222
return relation[i][j];
223
break;
224
case ')':
225
j = 5;
226
return relation[i][j];
227
break;
228
case '\n':
229
j = 6;
230
return relation[i][j];
231
break;
232
}
233
break;
234
case '\n':
235
i = 6;
236
switch(c)
237
{
238
case '+':
239
j = 0;
240
return relation[i][j];
241
break;
242
case '-':
243
j = 1;
244
return relation[i][j];
245
break;
246
case '*':
247
j = 2;
248
return relation[i][j];
249
break;
250
case '/':
251
j = 3;
252
return relation[i][j];
253
break;
254
case '(':
255
j = 4;
256
return relation[i][j];
257
break;
258
case ')':
259
j = 5;
260
return relation[i][j];
261
break;
262
case '\n':
263
j = 6;
264
return relation[i][j];
265
break;
266
}
267
break;
268
default :
269
return NULL;
270
break;
271
}
272
return NULL;
273
}
274
float Operator(float first,char theta,float second)
275
{
276
switch(theta)
277
{
278
case '+':
279
return first + second;
280
break;
281
case '-':
282
return first - second;
283
break;
284
case '*':
285
return first * second;
286
break;
287
case '/':
288
return first / second;
289
break;
290
default:
291
break;
292
}
293
}
294
BOOL In(char c,char *OP)
295
{
296
int i = 0;
297
while(OP[i] != '\0')
298
{
299
if(OP[i] == c)
300
{
301
return 1;
302
}
303
i++;
304
}
305
return 0;
306
}
[文件] demo.cpp ~ 3KB 下载(123)
001
#include <stdio.h>
002
#include <stdlib.h>
003
#include "evaluation.h"
004
#include "stack.h"
005
int main()
006
{
007
OpStack OPTR; //运算符栈
008
NumStack OPND; //操作数栈
009
char expression[40] = {0}; //保存表达式
010
int i = 0; //操作数和运算符存储标志
011
char c = 0; //接受用户的输入
012
float opNum = 0; //转换操作数
013
int flag = 0; //操作数是否进栈的标志位
014
int printFlag = 0; //控制操作数数组和操作符数组是否打印的标志位
015
char e = 0; //接受出栈的值
016
float a = 0; //保存第一操作数
017
float b = 0; //保存第二操作数
018
char theta = 0; //保存运算符
019
float result = 0; //运算结果
020
int QUIT = 1; //判断是否推出的标志
021
022
//初始化栈
023
InitOpStack(&OPTR);
024
InitNumStack(&OPND);
025
026
//运算符栈先入栈'#'
027
OpPush(&OPTR,'\n');
028
029
menu();
030
while(QUIT)
031
{
032
printf("请输入你的选择(0~1):");
033
c = getchar();
034
fflush(stdin);
035
if(c == 49)
036
{
037
i = 0;
038
printf("请输入你的表达式:\n");
039
c = getchar();
040
expression[i] = c;
041
++i;
042
while(c != '\n' || OpGetTop(OPTR,&e) && e != '\n')
043
{
044
if(!In(c,OP)) //如否不是运算符就入操作数栈
045
{
046
if(opNum == 0)
047
{
048
opNum = (float)(c - 48);
049
c = getchar();
050
expression[i] = c;
051
++i;
052
if(In(c,OP))
053
flag = 1;
054
}
055
else
056
{
057
opNum = opNum * 10 + (c - 48);
058
c = getchar();
059
expression[i] = c;
060
++i;
061
if(In(c,OP))
062
flag = 1;
063
}
064
if(flag == 1)
065
{
066
NumPush(&OPND,opNum);
067
flag = 0;
068
opNum = 0;
069
}
070
}
071
else
072
{
073
OpGetTop(OPTR,&e);
074
switch(Precede(e,c))
075
{
076
case '<': //栈顶元素优先权低
077
OpPush(&OPTR,c);
078
c = getchar();
079
expression[i] = c;
080
++i;
081
break;
082
case '=': //去掉括号并接受下一个字符
083
OpPop(&OPTR,&e);
084
c = getchar();
085
expression[i] = c;
086
++i;
087
break;
088
case '>': //退栈并将运算结果入栈
089
OpPop(&OPTR,&theta);
090
NumPop(&OPND,&b);
091
NumPop(&OPND,&a);
092
NumPush(&OPND,Operator(a,theta,b));
093
break;
094
default:
095
break;
096
}
097
}
098
}
099
for(int j = 0;expression[j] != '\n';j++ )
100
{
101
printf("%c",expression[j]);
102
}
103
printf(" %c ",'=');
104
NumGetTop(OPND,&result);
105
printf("%0.2f\n",result);
106
}
107
else if(c == 48)
108
{
109
break;
110
}
111
else
112
{
113
printf("输入错误!请重新输入!!\n");
114
}
115
}
116
//system("PAUSE");
117
return 0;
118
}
[文件] evaluation.h ~ 489B 下载(111)
01
#ifndef EVALUATION_H
02
#define EVALUATION_H
03
#define FALSE 0
04
#define TRUE 1
05
#define BOOL int
06
07
extern char relation[7][7]; //运算符关系数组
08
extern char OP[8]; //运算符数组
09
void menu();
10
char Precede(char opnd,char c); //判断运算的优先级
11
float Operator(float first,char theta,float second); //进行操作数之间的操作
12
BOOL In(char c,char *OP); //判断输入的值是否运算符
13
#endif
[文件] stack.cpp ~ 2KB 下载(112)
001
#include <stdlib.h>
002
#include <malloc.h>
003
#include <memory.h>
004
#include <assert.h>
005
#include "stack.h"
006
007
const int STACK_INIT_SIZE = 100; // 初始分配的长度
008
const int STACKINCREMENT = 10; // 分配内存的增量
009
BOOL InitNumStack(NumStack *S)
010
{
011
S->base = (float *)malloc(STACK_INIT_SIZE *sizeof(float));
012
if(S ->base == NULL)
013
return FALSE;
014
S ->top = S ->base;
015
S->stacksize = STACK_INIT_SIZE;
016
return TRUE;
017
}
018
void NumDestroyNumStack(NumStack *S)
019
{
020
assert(S != NULL);
021
free(S ->base);
022
S->base = S->top = NULL;
023
}
024
BOOL NumGetTop(NumStack S, float *e)
025
{
026
assert((S.base != NULL) && (S.top != NULL));
027
if(S.top == S.base)
028
exit(0);
029
*e = *(--S.top);
030
return TRUE;
031
}
032
BOOL NumPush(NumStack *S, float e)
033
{
034
if(S == NULL)
035
return FALSE;
036
assert((S->base != NULL) && (S ->top != NULL));
037
if(S ->top - S ->base >= S->stacksize)
038
{
039
S ->base = (float *)realloc(S ->base,(S ->stacksize + STACKINCREMENT) * sizeof(float));
040
if(! S ->base)
041
exit(0);
042
S ->top = S->base + S ->stacksize;
043
S ->stacksize += STACKINCREMENT;
044
}
045
*(S ->top++) = e;
046
return TRUE;
047
}
048
BOOL NumPop(NumStack *S, float *e)
049
{
050
if((* S).top == (*S).base)
051
return FALSE;
052
*e = * --(* S).top;
053
return TRUE;
054
}
055
056
057
058
059
060
BOOL InitOpStack(OpStack *S)
061
{
062
S->base = (char *)malloc(STACK_INIT_SIZE *sizeof(char));
063
if(S ->base == NULL)
064
return FALSE;
065
S ->top = S ->base;
066
S->stacksize = STACK_INIT_SIZE;
067
return TRUE;
068
}
069
void OpDestroyOpStack(OpStack *S)
070
{
071
assert(S != NULL);
072
free(S ->base);
073
S->base = S->top = NULL;
074
}
075
BOOL OpGetTop(OpStack S,char*e)
076
{
077
assert((S.base != NULL) && (S.top != NULL));
078
if(S.top == S.base)
079
exit(0);
080
*e = *(--S.top);
081
return TRUE;
082
}
083
BOOL OpPush(OpStack *S,char e)
084
{
085
if(S == NULL)
086
return FALSE;
087
assert((S->base != NULL) && (S ->top != NULL));
088
if(S ->top - S ->base >= S->stacksize)
089
{
090
S ->base = (char *)realloc(S ->base,(S ->stacksize + STACKINCREMENT) * sizeof(char));
091
if(! S ->base)
092
exit(0);
093
S ->top = S->base + S ->stacksize;
094
S ->stacksize += STACKINCREMENT;
095
}
096
*(S ->top++) = e;
097
return TRUE;
098
}
099
BOOL OpPop(OpStack *S,char *e)
100
{
101
if((* S).top == (*S).base)
102
return FALSE;
103
*e = * --(* S).top;
104
return TRUE;
105
}
[文件] stack.h ~ 777B 下载(110)
01
#ifndef STACK_H
02
#define STACK_H
03
#define FALSE 0
04
#define TRUE 1
05
#define BOOL int
06
/*
07
* 栈结构的定义
08
*/
09
10
11
/*
12
*操作数栈
13
*/
14
typedef struct NumStack
15
{
16
float *base;
17
float *top;
18
int stacksize;
19
}NumStack;
20
/*
21
*操作符栈
22
*/
23
typedef struct OpStack
24
{
25
char *base;
26
char *top;
27
int stacksize;
28
}OpStack;
29
/*
30
*操作数栈的基本操作
31
*/
32
BOOL InitNumStack(NumStack *S);
33
void NumDestroyNumStack(NumStack *S);
34
BOOL NumGetTop(NumStack S,float *e);
35
BOOL NumPush(NumStack *S,float e);
36
BOOL NumPop(NumStack *S,float *e);
37
/*
38
*操作符栈的基本操作
39
*/
40
BOOL InitOpStack(OpStack *S);
41
void OpDestroyOpStack(OpStack *S);
42
BOOL OpGetTop(OpStack S,char*e);
43
BOOL OpPush(OpStack *S,char e);
44
BOOL OpPop(OpStack *S,char *e);
45
#endif
|