Visitors hit counter dreamweaver

严蔚敏《数据结构》C语言版 第三章 算法3.4 表达式求值

  这个我是看到华为今年招聘的机试题的第三题。

   输入一串算术表达式的字符串,把它的结果算出来。

  1 //表达式求值(输入、输出和中间结果均只能是0~9)运算符仅限+-*/。
2 #include <stdio.h>
3 #include <string.h>
4 #include <stdlib.h>
5 #define STACK_INIT_SIZE 100
6 #define STACKINCREMENT 10
7 #define ERROR 0
8 #define OK 1
9 #define MAX 100
10 typedef int SElemType;
11 typedef struct SqStack
12 {
13 char*top;
14 char*base;
15 int stacksize;
16 }SqStack;
17
18 int InitStack(SqStack *S)
19 {
20 (*S).base=(char*)malloc(STACK_INIT_SIZE*sizeof(char));
21 if(!(*S).base) return ERROR;
22 (*S).top=(*S).base;
23 (*S).stacksize=STACK_INIT_SIZE;
24 return OK;
25 }
26 int Push(SqStack *S,char e)
27 {
28 if(((*S).base-(*S).top)>(*S).stacksize)
29 {
30 (*S).base=(char*)realloc((*S).base,
31 (STACKINCREMENT+(*S).stacksize)*sizeof(char));
32 (*S).top=(*S).base+(*S).stacksize;
33 (*S).stacksize+=STACKINCREMENT;
34 }
35 if(!(*S).base)
36 {
37 printf("FAILURE to realloc the Memory units!\n");
38 exit(ERROR);
39 }
40 *((*S).top)++=e;
41 return OK;
42 }
43 int Pop(SqStack *S,char *e)
44 {
45 if((*S).top==(*S).base)
46 {
47 printf("下溢!");
48 exit(ERROR);
49 }
50 else
51 {
52 *e=*--(*S).top;
53 }
54 return OK;
55 }
56 char GetTop(SqStack S)
57 {
58 if(S.base==S.top) return ERROR;
59 return *(S.top-1);
60 }
61
62 int In(char c) //判断C是否是操作符
63 {
64 switch(c)
65 {
66 case'+':
67 case'-':
68 case'*':
69 case'/':
70 case'(':
71 case')':
72 case'#':return OK;
73 break;
74 default:return ERROR;
75 }
76
77 }
78
79 char Precede(char t1,char t2) // 判断两个运算符的优先级
80 {
81 char f;
82 switch(t2)
83 {
84 case '+':
85 case '-': if(t1=='('||t1=='#')
86 f='<';
87 else
88 f='>';
89 break;
90 case '*':
91 case '/':if(t1=='*'||t1=='/'||t1==')')
92 f='>';
93 else
94 f='<';
95 break;
96 case '(': if(t1==')')
97 {
98 printf("ERROR1\n");
99 exit(ERROR);
100 }
101 else
102 f='<';
103 break;
104 case ')':switch(t1)
105 {
106 case '(':f='=';
107 break;
108 case '#':printf("ERROR2\n");
109 exit(ERROR);
110 default: f='>';
111 }
112 break;
113 case '#':switch(t1)
114 {
115 case '#':f='=';
116 break;
117 case '(':printf("ERROR3\n");
118 exit(ERROR);
119 default: f='>';
120 }
121 }
122 return f;
123 }
124
125 int operate(int a,char theta,int b)
126 {
127 int c;
128 switch(theta)
129 {
130 case'+':c=a+b;
131 break;
132 case'-':c=a-b;
133 break;
134 case'*':c=a*b;
135 break;
136 case'/':c=a/b;
137 break;
138 }
139 return c;
140 }
141
142 char EvaluateExpression()
143 {//算术表达是求值的算符优先算法。设OPTR和OPND分别为运算符栈和运算数栈,
144 //OP为运算符集合
145 char x,a,b;
146 char c;
147 int e;
148 int i,j;
149 SqStack OPTR,OPND;
150 InitStack(&OPTR);Push(&OPTR,'#');
151 InitStack(&OPND);
152 printf("请输入算术表达式:以#结束。如3+4-4/2#\n");
153 c=getchar();
154 while(c!='#'||GetTop(OPTR)!='#')
155 {
156 if(!In(c))
157 {Push(&OPND,c);c=getchar();} //不是运算符则进栈
158 else
159 {
160 switch(Precede(GetTop(OPTR),c))
161 {
162 case '<'://栈顶元素优先级低
163 Push(&OPTR,c);c=getchar();
164 break;
165 case'='://脱括号并接收下一个字符
166 Pop(&OPTR,&x);c=getchar();
167 break;
168 case'>'://退栈并将运算结果入栈
169 Pop(&OPTR,&x);
170 Pop(&OPND,&a);Pop(&OPND,&b);
171 i=atoi(&a);j=atoi(&b); //这个函数是别人告诉我的 网上查了用法
172 //用这两个函数可以避免用ASCII码。但是这不是跨平台的。
173 e=operate(j,x,i);
174 itoa(e,&a,10);
175 Push(&OPND,a);
176 break;
177 }
178 }//else
179 }//end_of_while
180 return GetTop(OPND);
181 }//end_of_EvaluateExpression
182
183 int main()
184 {
185 char a;
186 a=EvaluateExpression();
187 printf("%c",a);
188 printf("\n");
189 }



posted @ 2011-10-09 00:23  Jason Damon  阅读(8005)  评论(2编辑  收藏  举报