C语言表达式计算器
为了方便了解流程,在程序中把计算过程也输出了.而且栈操作的实现部分也是自己实现的._UDuVhL qsf程序用两个栈,optr寄存运算符,opnd寄存操作数和运算结果.输入的表达式以等号结束,例如:2*(1+2)=K$d}4^/w)^
/**************表达式计算器************/i AA!]!ok
#include <stdio.h>
#include <stdlib.h>2FEy7T5l4}
#include <string.h>N:nU\ u
#include <conio.h>
#include <malloc.h>5A)pd y.zWs
#define STACK_SIZE 100M,MIS(|
#define APPEND_SIZE 10:\Yq4do\~
struct SNode{"s7F:c2k%f,yE\%S
float data; /*存放操作数或者计算结果*/ JZ V+n+mGv MD
char ch; /*存放运算符*/
};
p~n)m0S(PS%t+_
struct Stack{ o/CD |/AL f
SNode *top;iI` tvk.W:I)f~
SNode *base;
int size;
};
/*栈操作函数*/
int InitStack(Stack &S); /*创建栈*/
int DestroyStack(Stack &S); /*销毁栈*/
int ClearStack(Stack &S); /*清空栈*/c a8GlaZz|
int GetTop(Stack S, SNode &e); /*取出栈顶结点并返回节点值*/(jr on-o0|O2D
int Push(Stack &S,SNode e); /*将结点e压入栈*/
int Pop(Stack &S,SNode &e); /*删除栈顶结点并返回其节点值*/
/*表达式计算器相关函数*/+Wu#t }(Wq%^4~n'W_
char get_precede(char s,char c); /*判断运算符s和c的优先级*/,n!tj,t$ffC*{O~I
int isOpr(char c); /*判断输入的字符是不是运算符,是则返回0,否返回1*/3T$q.]R;R\hP5`/z
float operate(float x, char opr, float y); /*计算x和y经过运算符opr计算后的结果*/
float compute(); /*表达式结算器主函数*/
char *killzero(float result); /*去掉结果后面的0*/ *vg3h @g}pH"@^hn
int InitStack(Stack &S)
{?.K_ ^'V;AZ
S.base=(SNode *)malloc(STACK_SIZE * sizeof(struct SNode));
if(S.base==NULL) q#t v]${'T w
{cq Nj [
printf("动态分配内存失败!");fB5z]8|
return -1;
}
S.top=S.base;rj5sA?4E_
S.size=STACK_SIZE;
return 0;
}3l#I'N)DXM2]-U
c$g%[UWq
int DestroyStack(Stack &S)
{ rPV7Q!a`w B
free(S.base);
return 0;-y4xGvW*lJ B
}
}$ba^(\"]4C!kCl
int ClearStack(Stack &S)
{
S.top=S.base;
return 0;![M9ZD(P:bf9Oy
}
int GetTop(Stack S,SNode &e)
{
if(S.top==S.base)3F:kIvu'E1@
{ w&f7ukU#t
printf("栈以为空!");
return -1;t'c;_B(l"dS0n8q/W1q
} YE%u2\S5E#j
e=*(S.top-1);A3G[:SFl3\A
return 0;
} n-U#NQ.c0D
H0J h$K }]9sE2e
int Push(Stack &S,SNode e),o?o:D |K*c4c
{
if(S.top-S.base>=S.size)
{dn$f%X$i9C$]$I!U
S.base=(SNode *)realloc(S.base,(S.size+APPEND_SIZE)*sizeof(struct SNode));X0u v,XrOsK
if(S.base==NULL)
{
printf("动态分配内存失败!");
return -1;&BWo$car
}
S.top=S.base+S.size;
S.size+=APPEND_SIZE;
}UM^]Z U2?D;V
*S.top=e;hk6fZ5\f*H!s
S.top++;
return 0;.mt8}%t1[o^
}^8q~GGEQ*F&V
1`t*CpKC:I x,w
int Pop(Stack &S,SNode &e)
{
if(S.top==S.base)
{$u1b2B&j$`| p
printf("栈为空!");
return -1;'Yt,{D(AT~;N#dvk
}
e=*(S.top-1);3Xtf.i^G_
S.top--;
return 0;
}L7uaF3Z9e&W^)G_t3k
char get_precede(char s,char c)
{'Vg/cB#ke$hv
switch(s)1g R{#k`*jp8|T_
{
case '+':
case '-':}d?$@L0Jd)p!}
if(c=='+'||c=='-')
return '>';K{~P,oEm'@'K w a
else if(c=='*'||c=='/'),h.VO{,z;\5u }
return '<';
else if(c=='(')-^,Eq'~~ FG ~
return '<';Ra5B.|7x%L g4x
else if(c==')')4Z!OW)r]pL2{kP%C
return '>';
else
return '>';h4RC_J"e*I
case '*':
case '/':1]/b lE2P`R8d(c
if(c=='+'||c=='-')
return '>';
else if(c=='*'||c=='/')
return '>';3g3f.| d,o
else if(c=='(')6O}fgrDp
return '<';
else if(c==')')S:[7C8nbWuK
return '>';
elseu)^lS%KC
return '>';
case '(':1jwT"o-M1}
if(c=='+'||c=='-')c.~)jnN
return '<';
else if(c=='*'||c=='/')$d&Z8m,\:qb
return '<';%}j/C ?+LfNkn
else if(c=='(')
return '<';xsT#F2O%A$Ug0N
else if(c==')')+jiV6?7WY
return '=';
else~)m+T%\L7G1g2E
return 'E';"`/Fo*~R%d|
case ')': W-fP3[a~._
if(c=='+'||c=='-')
return '>';
else if(c=='*'||c=='/')
return '>';
else if(c=='(')
return 'E';
else if(c==')')0g2G9?g_"n!v
return '>';
else#Ja0fJ$c9KH
return '>';.iM1S G S+S'L
case '#':A [qg^ ~(O
if(c=='+'||c=='-')G#EL nCho5t/K9B
return '<';
else if(c=='*'||c=='/')
return '<';!{8B_u\:pq:sgY
else if(c=='(') I:R5z*J|$Xa1f K
return '<';
else if(c==')')9Px v2Tw
return 'E';
else
return '=';U4g5d#o.I ]IS't5c
default:
break;
}+h8E8jM0v&Pb
return 0; M"Qr,qw
}'L']#f w:ZK9akA3R8Ep
int isOpr(char c)
{;F-Qh/d'u Q
if(c=='+'||c=='-'||c=='*'||c=='/'||c=='('||c==')'||c=='=')|N%R,nx)Ylhb{
return 0;
else ;Q*r4m/{ gf.Q
return 1;
}
float operate(float x, char opr, float y)
{