표현식 값 구하기 M
32525 단어 표현식
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("
");
148 exit(Overflow);
149 }
150 else
151 f='<';
152 break;
153 case ')':switch(t1)
154 { case '(':f='=';
155 break;
156 case'
':printf("
");
157 exit(Overflow);
158 default :f='>';
159 }
160 break;
161 case'#':switch(t1)
162 { case'#':f='=';
163 break;
164 case '(':printf("
");
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
",result);
206 return Ok;
207 }
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Java Lambda 표현식의 집합에서 흐름으로집합에서 흐름으로 이제 우리는 코드로 특정한 집합에 대한 교체 작업을 구체적으로 표시합니다. 우리는 연락처를 표시하기 위해 Contact 클래스를 정의하고 ContactList의 모든 String 유형의 연락처 이름...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.