C语言表达式计算器
为了方便了解流程,在程序中把计算过程也输出了.而且栈操作的实现部分也是自己实现的.#Ug9S |t3\7s程序用两个栈,optr寄存运算符,opnd寄存操作数和运算结果.输入的表达式以等号结束,例如:2*(1+2)=gB5Bol!^YWc)ti
/**************表达式计算器************/5Z2y%n L6~
#include <stdio.h>3HY _qs#di4e
#include <stdlib.h>%c/_Gee!d4S.SS+T
#include <string.h>&B-j"o"x[gzM2}
#include <conio.h>6z.N6WY(KF~v1a
#include <malloc.h>
V*A-ms T&fp
#define STACK_SIZE 100
#define APPEND_SIZE 10#O+P/@u2E.I"N
struct SNode{
float data; /*存放操作数或者计算结果*/.E&AD E9eussXd
char ch; /*存放运算符*/ r%X0c Tn#k2X
};
struct Stack{
SNode *top;
SNode *base; O p#eT1Rbr/q
int size;L n1oXx%B
};P aCt2z9R
/*栈操作函数*/E/o4u&YT
int InitStack(Stack &S); /*创建栈*/x#^)@| u0Y*Ym(A
int DestroyStack(Stack &S); /*销毁栈*/u%l0g&A$va"p
int ClearStack(Stack &S); /*清空栈*/
int GetTop(Stack S, SNode &e); /*取出栈顶结点并返回节点值*/yow,M7I4@ H$^
int Push(Stack &S,SNode e); /*将结点e压入栈*/eOk&`k2{n/[8j
int Pop(Stack &S,SNode &e); /*删除栈顶结点并返回其节点值*/7G x2~Ng:`9P+c{f
/*表达式计算器相关函数*/x%Hm8p v,Y}2e
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计算后的结果*/)g!bv]T6A7Q
float compute(); /*表达式结算器主函数*/
char *killzero(float result); /*去掉结果后面的0*/ Se)Xm5@g"u
int InitStack(Stack &S)Vl5Id!bjP
{6_~&K4IvI'f?K c
S.base=(SNode *)malloc(STACK_SIZE * sizeof(struct SNode));
if(S.base==NULL)
{
printf("动态分配内存失败!");V n ^ _VwES
return -1;
}(s$Mm,w+?Nu:a-y
S.top=S.base;$] @0l!FpP
S.size=STACK_SIZE;}|I~+C:b4K\uV
return 0;
}
int DestroyStack(Stack &S)
{
free(S.base);
return 0;
}N,}4c+V1cK
&]3I7f#o \x]p
int ClearStack(Stack &S)E1q iH0p c*Z\
{`xO VX,C|
S.top=S.base;
return 0;
}
w~MP _
int GetTop(Stack S,SNode &e)
{
if(S.top==S.base)
{;ftO he1Xw1w
printf("栈以为空!");G?6e"d#h*M
return -1;
}
e=*(S.top-1);t(zzK#lX LKg
return 0;
}
int Push(Stack &S,SNode e)/N4d.Q)l/e+d r5^
{2J2{4e/YAF+\4g
if(S.top-S.base>=S.size)
{j YC k&Q E7e~9|+o;@
S.base=(SNode *)realloc(S.base,(S.size+APPEND_SIZE)*sizeof(struct SNode));
if(S.base==NULL)
{v3CBZ4c rO7]
printf("动态分配内存失败!");
return -1;:wk Z FtWu
}
S.top=S.base+S.size;
S.size+=APPEND_SIZE;k&k.|8p2V q$Q{
}
*S.top=e;
S.top++;
return 0;
}
OuxXp"?o$y-|
int Pop(Stack &S,SNode &e)
{
if(S.top==S.base)
{2@m*~BP!hazn5v
printf("栈为空!");jw8P&eb `(j ^0Ae0m
return -1;1KstFPj G
}
e=*(S.top-1);&eom-Ke
S.top--;,lM!RG#Z6DW sE
return 0;
} }:uF_wVI&Z C1j*rB!m
%v qN'DF5YB
char get_precede(char s,char c)
{Xk-}c!C)t]
switch(s)
{4NB4rqS^g?
case '+':
case '-':
if(c=='+'||c=='-')
return '>';0r7w2iW5T'Jp:\$pv
else if(c=='*'||c=='/')
return '<';
else if(c=='(')
return '<';
else if(c==')')J7u%zt;rMx)T
return '>';
else
return '>';
case '*':
case '/':
if(c=='+'||c=='-')NtY)\{&G&y
return '>';
else if(c=='*'||c=='/')
return '>';+|Zo{wvW
else if(c=='(')i%E.SkJ:miK
return '<';
else if(c==')')
return '>';
else
return '>';