C语言表达式计算器
为了方便了解流程,在程序中把计算过程也输出了.而且栈操作的实现部分也是自己实现的.程序用两个栈,optr寄存运算符,opnd寄存操作数和运算结果.输入的表达式以等号结束,例如:2*(1+2)=
/**************表达式计算器************/ \5ErHy
#include <stdio.h>t{*bQayHjB(?~T
#include <stdlib.h>.I9[plv#M6e4F
#include <string.h>
#include <conio.h>
#include <malloc.h>/?DJcQea(q
#define STACK_SIZE 1001j2[ hwr.aZ:z
#define APPEND_SIZE 10IJ#pe:MU&z{
struct SNode{
float data; /*存放操作数或者计算结果*/7F/I)t5i.h1Q/Vq+g
char ch; /*存放运算符*/q"aP#@%}F0Rzn
};
struct Stack{F u*G"syGO
SNode *top;T0M9|#H0rk:Y$n
SNode *base;
int size;(c}K3M;oiD#d8si
};!P C"G*` }~
/*栈操作函数*/
int InitStack(Stack &S); /*创建栈*/$IZb'}!S*@
int DestroyStack(Stack &S); /*销毁栈*/7J0Tk|&ba
int ClearStack(Stack &S); /*清空栈*/
int GetTop(Stack S, SNode &e); /*取出栈顶结点并返回节点值*/u.LZXOh/mw
int Push(Stack &S,SNode e); /*将结点e压入栈*/3a0EzP\$IE
int Pop(Stack &S,SNode &e); /*删除栈顶结点并返回其节点值*/
/*表达式计算器相关函数*/
char get_precede(char s,char c); /*判断运算符s和c的优先级*/&Fd)oz LF$u/AE
int isOpr(char c); /*判断输入的字符是不是运算符,是则返回0,否返回1*/:ej4WOp'q?
float operate(float x, char opr, float y); /*计算x和y经过运算符opr计算后的结果*/
float compute(); /*表达式结算器主函数*/3x\h}4~"F4i
char *killzero(float result); /*去掉结果后面的0*/
mcM.p{w EVl
int InitStack(Stack &S)
{
S.base=(SNode *)malloc(STACK_SIZE * sizeof(struct SNode));
if(S.base==NULL)
{
printf("动态分配内存失败!");Fn+yx+P f IX"QBwH$y
return -1;-G Z)lw-w:}7E'J
}
S.top=S.base;W5Z?)~Pw"@p
S.size=STACK_SIZE;emZH B.Evb"K
return 0;2{eY7R+Q L%G;R
}
int DestroyStack(Stack &S)%jU%rK5Y'?C
{%a/\inDX}l
free(S.base);
return 0;gv;}}^@Z}U;ta
}^&hvdw%k
int ClearStack(Stack &S)1Ttih1Uf9U%{
{:]IxYn@o ?m Z+Vo
S.top=S.base;
return 0;4|)x;~;K%q Mh+s/`&W
}.h]B{.K g
'@:P*Fg-r;I/P0S4^
int GetTop(Stack S,SNode &e)
{
if(S.top==S.base)m\F6oB0Fz6M!x
{
printf("栈以为空!");
return -1; J(^2T}~]Lc
}$o8F4S4V\T Ur7gh)c
e=*(S.top-1);
return 0;
}
w1Z1[HGU]*qS
int Push(Stack &S,SNode e)
{!?Hgp4iK[
if(S.top-S.base>=S.size)9|u.SC#e
{
S.base=(SNode *)realloc(S.base,(S.size+APPEND_SIZE)*sizeof(struct SNode));
if(S.base==NULL)
{ P.MKV)g0N:U
printf("动态分配内存失败!");
return -1;G^ DY1^zB
}&p2t5Fk#K:mp Ed
S.top=S.base+S.size;Xc,]/CZB*E
S.size+=APPEND_SIZE;(cp s I)[{)Z+[5L
}
*S.top=e;![A\lqW
S.top++;X'_$T1F mE"U:pbk!eZr*\?
return 0;!_(K6f$~L3X
}
int Pop(Stack &S,SNode &e)
{
if(S.top==S.base)
{6bj(@K@!lW0D
printf("栈为空!");
return -1;
}
e=*(S.top-1);B(Oj+A.d6d
S.top--;
return 0; Ku.rlr%D6b4?)a"wZv
}
char get_precede(char s,char c) `)@v A0}
{'C`%X ?@h1}
switch(s)
{
case '+':
case '-':
if(c=='+'||c=='-')
return '>';
else if(c=='*'||c=='/')
return '<';
else if(c=='(')
return '<';
else if(c==')')t3_:uj5NvBx
return '>';
else U*OYu#l1R+g
return '>';5c;CRs"Qu$Y
case '*':