C语言表达式计算器
为了方便了解流程,在程序中把计算过程也输出了.而且栈操作的实现部分也是自己实现的.^lSYGv$cz"m @程序用两个栈,optr寄存运算符,opnd寄存操作数和运算结果.输入的表达式以等号结束,例如:2*(1+2)=/s(?U U,W
/**************表达式计算器************/
#include <stdio.h>)h#A(N%p%J&u(]
#include <stdlib.h>v [,p IZ8c\-`
#include <string.h>:c3{S@H0_V
#include <conio.h>
#include <malloc.h>
#define STACK_SIZE 100*`ccCL,` ~
#define APPEND_SIZE 10A5{ C#n!W:?#Q
?G3W4ioM
struct SNode{
float data; /*存放操作数或者计算结果*/
char ch; /*存放运算符*/7fD'Z)f ] a:M0b
};
7][Xq'o'v?"ro
struct Stack{cPs+hT#{v!e w
SNode *top;
SNode *base;
int size;
};
9hO*{9Ps_t!N
/*栈操作函数*/
int InitStack(Stack &S); /*创建栈*/$kfUe`wZ2w
int DestroyStack(Stack &S); /*销毁栈*/dW#_iNj P of
int ClearStack(Stack &S); /*清空栈*/^9kP,hjFK
int GetTop(Stack S, SNode &e); /*取出栈顶结点并返回节点值*/k1}(C"r b.t
int Push(Stack &S,SNode e); /*将结点e压入栈*/
int Pop(Stack &S,SNode &e); /*删除栈顶结点并返回其节点值*/R:}!B#K-z ^?
/*表达式计算器相关函数*//I&H p F%] }:`Wp8s \
char get_precede(char s,char c); /*判断运算符s和c的优先级*/
int isOpr(char c); /*判断输入的字符是不是运算符,是则返回0,否返回1*/g,U U B7m3e&\
float operate(float x, char opr, float y); /*计算x和y经过运算符opr计算后的结果*/
float compute(); /*表达式结算器主函数*/8Dn0g Sk4{0CU!i(Q
char *killzero(float result); /*去掉结果后面的0*/
int InitStack(Stack &S) [4Hm*x:Y@4D
{
S.base=(SNode *)malloc(STACK_SIZE * sizeof(struct SNode));5xn"yJ;i
if(S.base==NULL)
{D.`;F'@@5O
printf("动态分配内存失败!");
return -1;8m]E\k#Y"IP5B
}9dq^8ol/[W.PW:w
S.top=S.base;.P2Ad'Y7@ zA
S.size=STACK_SIZE;W;y s&EF"u(PDA
return 0;+\7\G&\*t%geMd
}9p}Ja;|
g*F;k ` P3nNL|:xl
int DestroyStack(Stack &S)
{5y'P"MD;Ni
free(S.base);7ta3|P,@
return 0;
}Q"~a V1R{
z&J;_K:V
int ClearStack(Stack &S)
{
S.top=S.base;#Xi!XN?ZF#]L
return 0;#{4I(jQ XHvV
},jb%e/e'F/_d(Y%bF
0x,|n}!Zd#i)` W*@
int GetTop(Stack S,SNode &e)'Q.i H9~u
{{1Q:\~9m
if(S.top==S.base)
{
printf("栈以为空!");"q1@W&M z
return -1;t(c9i C g1DC
}
e=*(S.top-1);%E1y?&~|5}*kS
return 0;
} qH2l8zK9nmp,j
#A vgv Z?},M
int Push(Stack &S,SNode e)
{-U4C,a(WL+n
if(S.top-S.base>=S.size) gefx0Y:Cq
{
S.base=(SNode *)realloc(S.base,(S.size+APPEND_SIZE)*sizeof(struct SNode));)cg6F)c#dC
if(S.base==NULL)
{9LM1YxG#t.AjM1KR
printf("动态分配内存失败!");5uj@0x`R)??
return -1;
}
S.top=S.base+S.size;
S.size+=APPEND_SIZE;
}
*S.top=e;
S.top++;
return 0;
}
int Pop(Stack &S,SNode &e)[2T-W-PY/{&iW~
{0o%j)H5y e,Q*`Sn
if(S.top==S.base)
{3A:O2y4y~c
printf("栈为空!");
return -1;3S7p$o O Em\^
}
e=*(S.top-1);
S.top--;.U j-vj%J:x
return 0;
}MN6{!t[5]B
char get_precede(char s,char c)
{
switch(s)
{!O4w9?!f g)hjdr
case '+':
case '-':
if(c=='+'||c=='-')
return '>';
else if(c=='*'||c=='/')
return '<';
else if(c=='(')
return '<';
else if(c==')')
return '>';
else
return '>';
case '*':^s\)]m1~c
case '/':7MPWMd&Q(lx-Y
if(c=='+'||c=='-')i4gU%aQO$WkZNz
return '>';
else if(c=='*'||c=='/')S+U%U;Fy$V*\K:v
return '>';6d*[%bI up-e
else if(c=='(')b0Jv'G%J7I'ea
return '<';
else if(c==')')
return '>'; j,`7f"@dw
else:uT9?SCxyzmk
return '>';
case '(':QP7P!J5s
if(c=='+'||c=='-')gI}B/hO#B(W
return '<';
else if(c=='*'||c=='/')
return '<';
else if(c=='(')
return '<';[i,l0Z3IO/J6s|3J
else if(c==')')&LU+X1J6[k6o7l |
return '=';
else"|OD#vaEK
return 'E';
case ')':3\4r-['wn0y@]2n
if(c=='+'||c=='-')#S@^sH Y TZ A
return '>';
else if(c=='*'||c=='/')
return '>';
else if(c=='(')l-Zi|P
return 'E';H ?m(~ m9P9X.l
else if(c==')')
return '>';
else4q4~R+cOw
return '>';
case '#':E K7tl6E*N@/T.K
if(c=='+'||c=='-')g2Q I&i&H7g.gTsi
return '<';
else if(c=='*'||c=='/')N L!aug#e0a1P
return '<';
else if(c=='(')`9WHP:{ J [(s:n
return '<';
else if(c==')')
return 'E';![d,X~3u
else|o&aS,ZS
return '=';m%f-\b1u(J8Q
default:#@7FWvMa-c"e,W
break;
}([6{(Xqs/MLQ
return 0; mp:G)Xs.J
}7ASb/|%YMU
int isOpr(char c)+Nb}ee ^U jL U*XQ
{_/M0H"~Y/Z
if(c=='+'||c=='-'||c=='*'||c=='/'||c=='('||c==')'||c=='=')