C语言表达式计算器
为了方便了解流程,在程序中把计算过程也输出了.而且栈操作的实现部分也是自己实现的.g8r%l{ g,L1O程序用两个栈,optr寄存运算符,opnd寄存操作数和运算结果.输入的表达式以等号结束,例如:2*(1+2)=
/**************表达式计算器************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>+sG Y/E-\4u^
#include <malloc.h>
U&XE1i\,~
#define STACK_SIZE 100
#define APPEND_SIZE 10!M;}"k]a+D0_O
struct SNode{
float data; /*存放操作数或者计算结果*/&n al*OO s*g ~ R
char ch; /*存放运算符*/7nf{,mK2u
}; {@Fo2S&xV|0}d
X?j'w+_LQy
struct Stack{
SNode *top;#]6oQ p!mY [.N:f[
SNode *base;
int size;
};3W?!RW;?&G"r
!{7Q:hX/m'J#?&u%~
/*栈操作函数*/
int InitStack(Stack &S); /*创建栈*/)ao H,O D{5UU
int DestroyStack(Stack &S); /*销毁栈*/ sv+D9rNr
int ClearStack(Stack &S); /*清空栈*/
int GetTop(Stack S, SNode &e); /*取出栈顶结点并返回节点值*/(_ d+?7S/U|-g7E
int Push(Stack &S,SNode e); /*将结点e压入栈*/zVXe;v%j
int Pop(Stack &S,SNode &e); /*删除栈顶结点并返回其节点值*/
P8_:J{Q
/*表达式计算器相关函数*/+X(]1E Q&].d*OV"P
char get_precede(char s,char c); /*判断运算符s和c的优先级*/2V-zS0eV
int isOpr(char c); /*判断输入的字符是不是运算符,是则返回0,否返回1*/
float operate(float x, char opr, float y); /*计算x和y经过运算符opr计算后的结果*/
float compute(); /*表达式结算器主函数*/
char *killzero(float result); /*去掉结果后面的0*/
int InitStack(Stack &S)0t6L.Tbt
{u*v'S9o Z'Dm
S.base=(SNode *)malloc(STACK_SIZE * sizeof(struct SNode));G-OF5Cyx_8T
if(S.base==NULL)
{x,JPS W;NW
printf("动态分配内存失败!");%GK5TJ y(@1C:~
return -1;9sB(xh0v[
}kW.B2_"iy,w
S.top=S.base;
S.size=STACK_SIZE;
return 0;o+n q XLE{K
}pMRU7qrxA
{CO.IR.y9y7N
int DestroyStack(Stack &S)
{
free(S.base);N^7z/L*gJ8y
return 0;
}
int ClearStack(Stack &S)9B,A~u X~
{
S.top=S.base;\;{+C~X.Kf
return 0; K9p Bt#D
}
M[6{B:@P8Rc?y
int GetTop(Stack S,SNode &e)
{
if(S.top==S.base)
{3a|5_;~)Hdz
printf("栈以为空!");
return -1;
} K8E~ZXD p
e=*(S.top-1);
return 0;
}
int Push(Stack &S,SNode e)sO5t&w;{axn#~0L
{
if(S.top-S.base>=S.size)
{?Q m"s!I6k.O!s?
S.base=(SNode *)realloc(S.base,(S.size+APPEND_SIZE)*sizeof(struct SNode));
if(S.base==NULL)
{#y#H&t9GTL'w_+la?l
printf("动态分配内存失败!");c Xs'D9G$j
return -1;q6bNpy
}
S.top=S.base+S.size;
S.size+=APPEND_SIZE;
}
*S.top=e;
S.top++;
return 0;,zBt w[&I
}9o`EkF'mc a `!a8J
0w&\6_5Y&|z
int Pop(Stack &S,SNode &e)"m p0EABf(^4CIG$qG
{,D2JMa'l Fyv
if(S.top==S.base)
{b Z%r;L.@:B9R
printf("栈为空!"); u&H2@@R [X%K
return -1;_+Y$B^;H/w8s
}B?+JCS^*~6Z
e=*(S.top-1);N.yz(c3N/Gf#}
S.top--;3H`R]"DC})a-r4|
return 0;
}
fER-u^L5F&\
char get_precede(char s,char c);ucQ'F1]
{
switch(s)${ ?h9oYC-G?
{ h2Q3G SB
case '+':
case '-':
if(c=='+'||c=='-')l Mhu6EE
return '>';5^1w.E d{ C^
else if(c=='*'||c=='/')2d1Vv0f"s!nY
return '<';
else if(c=='(')'_Kz$]:B ik+z
return '<';(w'Qr `1r K#|;{y W
else if(c==')')qSd]G
return '>';y6I6X0q4Y cH}`
else '?U:pta9y)SS
return '>';*E/e)}7zN;y)] |
case '*':J5J(V*t5D4l;Y a
case '/':
if(c=='+'||c=='-')
return '>';
else if(c=='*'||c=='/')
return '>';!L2Vh4Wimc?
else if(c=='(')
return '<';#B gxq6}-x
else if(c==')')
return '>';Z,]z0\r%R*J7n
else
return '>';
case '(':
if(c=='+'||c=='-')
return '<';
else if(c=='*'||c=='/')
return '<';9{1pES:zLe}
else if(c=='(')
return '<';"z-cd1i9py a1s7mN[
else if(c==')')
return '=';z~ xon z
else3}0w9d'`7G[d}
return 'E';
case ')': O0r FYP0[T0U
if(c=='+'||c=='-')GmUEC#~DU"@ G
return '>';z&fh[6n-j,B;j Zh
else if(c=='*'||c=='/')
return '>';;S"dj7rnq8}3d WX1U
else if(c=='(')$QPI"h5s)T
return 'E';
else if(c==')')
return '>';
else
return '>';/H;M0o!i8E9fE4V"M:y
case '#':A:k Cypm
if(c=='+'||c=='-')
return '<';
else if(c=='*'||c=='/')
return '<';MQ0W\N H
else if(c=='(')
return '<'; us.gEQ#OI
else if(c==')')
return 'E';
else