C语言表达式计算器
为了方便了解流程,在程序中把计算过程也输出了.而且栈操作的实现部分也是自己实现的. U"H9Y J D程序用两个栈,optr寄存运算符,opnd寄存操作数和运算结果.输入的表达式以等号结束,例如:2*(1+2)=
/**************表达式计算器************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>*Xe's$n!u
#include <conio.h>
#include <malloc.h>Ahy0GB5Ut:dH2t
#define STACK_SIZE 100
#define APPEND_SIZE 10
7b%lu8uz%s A5k
struct SNode{
float data; /*存放操作数或者计算结果*/
char ch; /*存放运算符*/
};1^Wkw$o
struct Stack{2|dH7u"g;?};n_
SNode *top;
SNode *base;:S5lG7BNG|I)lmMO
int size;8OL'^W\vW l
};2@7u}8o{k {GP+R
by0k1o$u,rc"~
/*栈操作函数*/
int InitStack(Stack &S); /*创建栈*/.O.spg2e(d
int DestroyStack(Stack &S); /*销毁栈*/;X t/~*l/q
int ClearStack(Stack &S); /*清空栈*/[$](HF WV
int GetTop(Stack S, SNode &e); /*取出栈顶结点并返回节点值*/
int Push(Stack &S,SNode e); /*将结点e压入栈*/
int Pop(Stack &S,SNode &e); /*删除栈顶结点并返回其节点值*/ v[3jY0q1Py-P
$C}d]-JlN!pZW
/*表达式计算器相关函数*/ xHvl4Sq+e
char get_precede(char s,char c); /*判断运算符s和c的优先级*/
int isOpr(char c); /*判断输入的字符是不是运算符,是则返回0,否返回1*/
float operate(float x, char opr, float y); /*计算x和y经过运算符opr计算后的结果*/A6d*|&?6TO*Y$D
float compute(); /*表达式结算器主函数*/
char *killzero(float result); /*去掉结果后面的0*/ @#d Zs.[!C3m!H
int InitStack(Stack &S)eH4tq;^P
{1o&?/Nq|$d
S.base=(SNode *)malloc(STACK_SIZE * sizeof(struct SNode));n(q/H7`-] aso%s'^1Ljb
if(S.base==NULL)
{
printf("动态分配内存失败!");
return -1;A)~8u2mf ]#fd;B
}
S.top=S.base;3h5^P^(B-jx2JfV6J
S.size=STACK_SIZE;!ERa$S BTf9I9K
return 0;^?4YNV+Kzb
}
int DestroyStack(Stack &S)
{
free(S.base);
return 0;H;ML'?c
}
+i1GFhH2YS
int ClearStack(Stack &S)U1H6h3{s2Sn,P
{
S.top=S.base;)],bkj!Eb nq"s
return 0;
}fHF@ mfU v
int GetTop(Stack S,SNode &e)
{@/b%GF]-_;U
if(S.top==S.base)? M&pT[+qP]'zk K
{QBY`b5aA9e/z
printf("栈以为空!");
return -1;
}
e=*(S.top-1);iDYTs1sI
return 0;9SeU"yb!XA0[w+~n
}^y,[RyE"w
UY?s*v4Xcp"b p
int Push(Stack &S,SNode e)
{
if(S.top-S.base>=S.size)
{F)_7OX Bf
S.base=(SNode *)realloc(S.base,(S.size+APPEND_SIZE)*sizeof(struct SNode));gRn&n ]]0X9x0^]
if(S.base==NULL)
{
printf("动态分配内存失败!");
return -1;@+f9Sv [/qGP(y
}N:kV$s.^+w a#X+aW \
S.top=S.base+S.size;7Xw3c{.}9sY8}G
S.size+=APPEND_SIZE;
} V&Zt*b)k
*S.top=e;%viZ \6z*ho~5h!ah
S.top++;
return 0;
}%H(Z2O g$wLxW F
int Pop(Stack &S,SNode &e)0[(d.ID-pLim
{M1[*X|!JKVf yO
if(S.top==S.base)
{5H0f`$n6H ]
printf("栈为空!");
return -1;Jpn!YZ2n1N
}
e=*(S.top-1);z+D7b9du8A
S.top--;
return 0;
}
nm"\ k7_1qX Q4a
char get_precede(char s,char c)
{
switch(s)h"B-?!p N"|
{.K;@z_.h h Q y
case '+':
case '-':
if(c=='+'||c=='-') qMoGv5kr&j]5x
return '>';Leg}R3UR;[3e
else if(c=='*'||c=='/')"K0W}:ga.P7i B7a
return '<';6NywPDf
else if(c=='(')
return '<';YL+zC%PE
else if(c==')')
return '>';iz m9d%b~5Wa
else 9?\z2W/X#y'j&i
return '>';
case '*':
case '/':f m"cUm
if(c=='+'||c=='-'){TkhS
return '>';]Rh } R$r~
else if(c=='*'||c=='/')s$[!M3TN:Et7[
return '>';
else if(c=='(')!pq4~y3Dp
return '<';4s-V^"H,jt*t!U
else if(c==')')Z.Z QP"@J-G
return '>';
else+Mq5b&M/eC
return '>';"L Tb6M-k
case '(':
if(c=='+'||c=='-')
return '<';5Mm%jH,C|-j F
else if(c=='*'||c=='/')
return '<';
else if(c=='(')
return '<';MIgf5aj%H
else if(c==')')+I%nMQAAXh
return '=';
else3A)]-HEz#O zN
return 'E';(JB|wJ$W
case ')':
if(c=='+'||c=='-'):];fPf*f[
return '>';
else if(c=='*'||c=='/')
return '>';&|3M D$z.z.^/Y-{
else if(c=='(')
return 'E';oTwuSM4CR;C0z)jF
else if(c==')')
return '>';
else
return '>';
case '#':
if(c=='+'||c=='-')p(mL,Gi8I
return '<';,f%l2hxV$Swl-X
else if(c=='*'||c=='/')
return '<';oogb+X(B
else if(c=='(')&rGt$uq.ic5q
return '<';
else if(c==')')
return 'E';