C语言表达式计算器
为了方便了解流程,在程序中把计算过程也输出了.而且栈操作的实现部分也是自己实现的.U9i6n7\L:_1bi(? LPTe程序用两个栈,optr寄存运算符,opnd寄存操作数和运算结果.输入的表达式以等号结束,例如:2*(1+2)=(rX0zp1A r
/**************表达式计算器************/ g+R,~8A;i
#include <stdio.h>|zD+| xeG,k |8Fz&g
#include <stdlib.h>
#include <string.h>
#include <conio.h>
#include <malloc.h>e{9f?a/k%]-B
#define STACK_SIZE 100j:IY-I(^9_9E
#define APPEND_SIZE 10R;r+K&aQ~1e\
,l-a{X N
struct SNode{~i|$F.Ek+u6c_){
float data; /*存放操作数或者计算结果*/
char ch; /*存放运算符*/
};
D#F*K9KX ]
struct Stack{
SNode *top;
SNode *base;-|;Y ~T0[
int size;W{_2ZwW:`f?
};'Z&E'e$CmPT
Ml q6Y}^G:I
/*栈操作函数*/
int InitStack(Stack &S); /*创建栈*/L#G~:P ~hw
int DestroyStack(Stack &S); /*销毁栈*/?BN1]h
int ClearStack(Stack &S); /*清空栈*/
int GetTop(Stack S, SNode &e); /*取出栈顶结点并返回节点值*/e T!j }A
int Push(Stack &S,SNode e); /*将结点e压入栈*/t.l*U3Uc%qJU&Ee4{L
int Pop(Stack &S,SNode &e); /*删除栈顶结点并返回其节点值*/
/*表达式计算器相关函数*/1u:j4z4dYX)s2f
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计算后的结果*/:s$fK0\Wx1}#go#e1y
float compute(); /*表达式结算器主函数*/E*[Z/hDS PD3P
char *killzero(float result); /*去掉结果后面的0*/
int InitStack(Stack &S)
{Y-V6|G&l lxE
S.base=(SNode *)malloc(STACK_SIZE * sizeof(struct SNode));+v!|!J/O1i+f'x'Y-?
if(S.base==NULL)rB,D4S1p1U&s
{u;C!vwaS7I
printf("动态分配内存失败!");
return -1;/U3k+r Ita8sfw)q:Il
}W{_vI4bHdO
S.top=S.base;
S.size=STACK_SIZE;
return 0;
}
int DestroyStack(Stack &S)
{ y/x,oDw,h U.sS2V
free(S.base);
return 0;
}
int ClearStack(Stack &S)
{J)@x'w0rmk
S.top=S.base;L-m{Q!`
return 0;
}
int GetTop(Stack S,SNode &e)6Q'vI&j/V3l%PwF
{'Q;tZB,P
if(S.top==S.base)7l |+J f3P`
{v"rZgtqJ
printf("栈以为空!");
return -1;
}
e=*(S.top-1);
return 0;
}
,s+e}kW M/@:V;W
int Push(Stack &S,SNode e)
{ qu%_A3qE(S`
if(S.top-S.base>=S.size) b]0UG)p _b
{
S.base=(SNode *)realloc(S.base,(S.size+APPEND_SIZE)*sizeof(struct SNode));
if(S.base==NULL)D\B~%{
{
printf("动态分配内存失败!"); _w(XY7W8{6x|-}
return -1;
}G&ny"]7fvF
S.top=S.base+S.size;^3aPdx
S.size+=APPEND_SIZE;%R,\m-ki
}Ok5J v Vj
*S.top=e;