1 #include<stdio.h>
2 #include<stdlib.h>
3 #define Stack_Size 100
4 #define StackIncrement 10
5 #define Ok 1
6 #define Error 0
7 #define Overflow -2
8 #define True 1
9 #define False 0
10 typedef int status;
11 char s[100];
12 //字符栈的操作
13 typedef struct
14 {
15 char *base;
16 char *top;
17 int stacksize;
18 }SqStack1;
19 status InitStack1(SqStack1 &S)
20 {
21 S.base=(char *)malloc(Stack_Size*sizeof(char));
22 if(!S.base) exit(Overflow);
23 S.top=S.base;
24 S.stacksize=Stack_Size;
25 return Ok;
26 }
27 status StackEmpty1(SqStack1 &S)
28 {
29 if(S.top==S.base)
30 return True;
31 else return False;
32 }
33 char GetTop1(SqStack1 S)
34 {
35 char e;
36 if(S.top==S.base) return Error;
37 e=*(S.top-1);
38 return e;
39 }
40 status Push1(SqStack1 &S,char e)
41 {
42 if((S.top-S.base)==S.stacksize)
43 {
44 S.base=(char *)realloc(S.base,(S.stacksize+StackIncrement)*sizeof(char));
45 if(!S.base) exit(Overflow);
46 S.top=S.base+S.stacksize;
47 S.stacksize+=StackIncrement;
48 }
49 *S.top++=e;
50 return Ok;
51 }
52 status Pop1(SqStack1 &S,char &e)
53 {
54 if(S.top==S.base) return Error;
55 e=*--S.top;
56 return Ok;
57 }
58 //数字栈的操作
59 typedef struct
60 {
61 float *base;
62 float *top;
63 int stacksize;
64 }SqStack2;
65 status InitStack2(SqStack2 &S)
66 {
67 S.base=(float *)malloc(Stack_Size*sizeof(float));
68 if(!S.base) exit(False);
69 S.top=S.base;
70 S.stacksize=Stack_Size;
71 return Ok;
72 }
73 status StackEmpty2(SqStack2 &S)
74 {
75 if(S.top==S.base)
76 return True;
77 else return False;
78 }
79 float GetTop2(SqStack2 S)
80 {
81 float e;
82 if(S.top==S.base) return Error;
83 e=*(S.top-1);
84 return e;
85 }
86 status Push2(SqStack2 &S,float e)
87 {
88 if((S.top-S.base)==S.stacksize)
89 {
90 S.base=(float *)realloc(S.base,(S.stacksize+StackIncrement)*sizeof(float));
91 if(!S.base) exit(False);
92 S.top=S.base+S.stacksize;
93 S.stacksize+=StackIncrement;
94 }
95 *S.top++=e;
96 return Ok;
97 }
98 status Pop2(SqStack2 &S,float &e)
99 {
100 if(S.top==S.base) return Error;
101 e=*--S.top;
102 return Ok;
103 }
104 //转化的操作过程
105 float Operate(float a,char theta,float b)
106 {
107 switch(theta)
108 {
109 case '+': return a+b;
110 case '-': return a-b;
111 case '*': return a*b;
112 case '/': return a/b;
113 default: return Error;
114 }
115 }
116 int In(char c)
117 {
118 switch(c)
119 {
120 case '+':
121 case '-':
122 case '*':
123 case '/':
124 case '(':
125 case ')':
126 case '#':return 1;
127 default:return 0;
128 }
129 }
130 char Precede(char t1,char t2)
131 {
132 char f;
133 switch(t2)
134 { case '+':
135 case '-':if(t1=='('||t1=='#')
136 f='<';
137 else
138 f='>';
139 break;
140 case '*':
141 case '/':if(t1=='*'||t1=='/'||t1==')')
142 f='>';
143 else
144 f='<';
145 break;
146 case '(':if(t1==')')
147 { printf("括号不匹配\n");
148 exit(Overflow);
149 }
150 else
151 f='<';
152 break;
153 case ')':switch(t1)
154 { case '(':f='=';
155 break;
156 case'\n':printf("缺乏左括号\n");
157 exit(Overflow);
158 default :f='>';
159 }
160 break;
161 case'#':switch(t1)
162 { case'#':f='=';
163 break;
164 case '(':printf("缺乏右括号\n");
165 exit(Overflow);
166 default :f='>';
167 }
168 }
169 return f;
170 }
171 float EvaluateExpression()
172 {
173 SqStack1 OPTR; SqStack2 OPND;
174 char theta,c,x; float a,b; int k; char *p=s;
175 InitStack1(OPTR); Push1(OPTR,'#');
176 InitStack2(OPND); c=*p;
177 while(c!='#'||GetTop1(OPTR)!='#')
178 {
179 if(!In(c))
180 {
181 for(k=0;!In(c);c=*++p)
182 k=10*k+(c-'0');
183 Push2(OPND,k);
184 }
185 else
186 switch(Precede(GetTop1(OPTR),c))
187 {
188 case'<': Push1(OPTR,c);c=*++p;break;
189 case'=': Pop1(OPTR,x); c=*++p;break;
190 case'>':
191 Pop1(OPTR,theta);
192 Pop2(OPND,b); Pop2(OPND,a);
193 Push2(OPND,Operate(a,theta,b));
194 }
195 }
196 return GetTop2(OPND);
197 }
198 //主函数
199 status main()
200 {
201 float result;
202 puts("请输入算术表达式");
203 gets(s);
204 result=EvaluateExpression();
205 printf("%.2f\n",result);
206 return Ok;
207 }