C语言表达式计算器
为了方便了解流程,在程序中把计算过程也输出了.而且栈操作的实现部分也是自己实现的.程序用两个栈,optr寄存运算符,opnd寄存操作数和运算结果.输入的表达式以等号结束,例如:2*(1+2)=
/**************表达式计算器************/
#include <stdio.h>
#include <stdlib.h>^!`|^O1BH"dj
#include <string.h>4xN\`f0O9O4p
#include <conio.h>
#include <malloc.h>,IH9LI:vC
#define STACK_SIZE 100!K"?s'|F0Th$N p8N/]
#define APPEND_SIZE 10 F!X wi|
struct SNode{
float data; /*存放操作数或者计算结果*/
char ch; /*存放运算符*/
}; nb$n8PR/wz
V2I w D{oQ
struct Stack{
SNode *top;3G"\T6E6K*uY*i
SNode *base;
int size;Xf6N6R~HK)K
};$M0? Up7zI,\
P"M o6ks ]buiE~
/*栈操作函数*/Q a*J2|l]
int InitStack(Stack &S); /*创建栈*/ky8G.h bV"N;K['p"a
int DestroyStack(Stack &S); /*销毁栈*/.RF+S*u j \.~9S
int ClearStack(Stack &S); /*清空栈*/-M)V"Pw)Da5E8R
int GetTop(Stack S, SNode &e); /*取出栈顶结点并返回节点值*/
int Push(Stack &S,SNode e); /*将结点e压入栈*/
int Pop(Stack &S,SNode &e); /*删除栈顶结点并返回其节点值*/0y!YUgz[&A:_,f
^ A,Cz!m%O+B
/*表达式计算器相关函数*/'@-A-?gO$@D}&A-?R
char get_precede(char s,char c); /*判断运算符s和c的优先级*/
int isOpr(char c); /*判断输入的字符是不是运算符,是则返回0,否返回1*/E/\p3lL
float operate(float x, char opr, float y); /*计算x和y经过运算符opr计算后的结果*/
float compute(); /*表达式结算器主函数*/
char *killzero(float result); /*去掉结果后面的0*/
~`"?^F
int InitStack(Stack &S) n}0iY1Hx.?
{
S.base=(SNode *)malloc(STACK_SIZE * sizeof(struct SNode));
if(S.base==NULL)
{`x1]KMOv
printf("动态分配内存失败!");
return -1;
}
S.top=S.base;u,[7a DM7b1NM
S.size=STACK_SIZE;S7Qh VmA-U
return 0;
}P"I9E+p9@:mWS*o
int DestroyStack(Stack &S)#BFn6q!lg0] u
{4jsNZ(X?4g
free(S.base);Z2\p7M|\ AC R
return 0; V3bi]4Z
}3a.r}"c+Rk
&iq,P"s sx
int ClearStack(Stack &S)
{
S.top=S.base;y8H/Ns-~7ko.sO
return 0;
})crcb.fi,V(K
int GetTop(Stack S,SNode &e)
{
if(S.top==S.base)
{P6`y%b:t'U
printf("栈以为空!");0\i|2@Dl1^lJ
return -1;
}
e=*(S.top-1);#ZY8V XusP3q'q
return 0;!u#Un!{lpi.D rh2f
}5ew"L/Q+rk{C
X!c/VV V
int Push(Stack &S,SNode e)VYB T;N5sw
{
if(S.top-S.base>=S.size)$[5]6S*IYV
{(|^1oIBW a
S.base=(SNode *)realloc(S.base,(S.size+APPEND_SIZE)*sizeof(struct SNode));4w:Uidr,L
if(S.base==NULL)
{
printf("动态分配内存失败!");
return -1;&\4a b EXw[l
}
S.top=S.base+S.size;[/egY)W(}8}:w9T
S.size+=APPEND_SIZE;pB/GSo
}
*S.top=e;z-M X4R+gp!r%y$QwJ%S
S.top++;
return 0;
} ]6b Bfp
int Pop(Stack &S,SNode &e)
{Z.F\7xDQ&m3s@)mg
if(S.top==S.base)
{e7@v \4xq6q|
printf("栈为空!");
return -1;IV ?'i_(E
}"N0x#~!K9f3]b
e=*(S.top-1);0C f$@,S+Q#`y5D
S.top--;2`'b0? F[ ^ n
return 0;
}
char get_precede(char s,char c)o]#^f7B
{!C.TdgM^[+I|
switch(s)