C语言表达式计算器
为了方便了解流程,在程序中把计算过程也输出了.而且栈操作的实现部分也是自己实现的.#x1H)Q L MU程序用两个栈,optr寄存运算符,opnd寄存操作数和运算结果.输入的表达式以等号结束,例如:2*(1+2)=
/**************表达式计算器************/AeD'x&j(oQD
#include <stdio.h>
#include <stdlib.h>
#include <string.h>rS"T H^ e1Nf
#include <conio.h>
#include <malloc.h>9T4|&sm.fa6h
vZ0h2]+xb}lC
#define STACK_SIZE 100
#define APPEND_SIZE 10
struct SNode{
float data; /*存放操作数或者计算结果*/
char ch; /*存放运算符*/ PIyOS'qH$^o
};#qlK;^5Q+G/[
-FBWi+Z;c
struct Stack{5U&V\(Qr0c
SNode *top;
SNode *base;+a/OI!pU#d2r Z
int size;
};;_+w!]/k9@kT.l
WAc lI%a:W9H+Ri
/*栈操作函数*/
int InitStack(Stack &S); /*创建栈*/)A Y~3_+NLA7A/@`
int DestroyStack(Stack &S); /*销毁栈*/
int ClearStack(Stack &S); /*清空栈*/
int GetTop(Stack S, SNode &e); /*取出栈顶结点并返回节点值*/*Mo _F'CK'H ]3u
int Push(Stack &S,SNode e); /*将结点e压入栈*/
int Pop(Stack &S,SNode &e); /*删除栈顶结点并返回其节点值*/;f&X[.j!jq-F
X5|:ZuH'R s7^
/*表达式计算器相关函数*/
char get_precede(char s,char c); /*判断运算符s和c的优先级*/
int isOpr(char c); /*判断输入的字符是不是运算符,是则返回0,否返回1*/@g7m-hF t&w
float operate(float x, char opr, float y); /*计算x和y经过运算符opr计算后的结果*/%u O(dSD
float compute(); /*表达式结算器主函数*/*B NX S\Qg
char *killzero(float result); /*去掉结果后面的0*/
int InitStack(Stack &S)l4|)? z\*GQ)Q
{&X\pI:jF
S.base=(SNode *)malloc(STACK_SIZE * sizeof(struct SNode));&uB|Q|tX
if(S.base==NULL)l6c8R3b%cZQ
{&L5aJ+jz4S U0_!Q"b
printf("动态分配内存失败!");MW8]'t6W2w
return -1; YMQ@y
}
S.top=S.base;
S.size=STACK_SIZE;
return 0;
}
int DestroyStack(Stack &S)6u.tFi-^~ ^6i
{U6L)je+R*qsz9h
free(S.base);
return 0;
}
'lNg@@BH [
int ClearStack(Stack &S)8t,C\&v1X[s{8e
{ LuG6lA;O
S.top=S.base;
return 0; zvxJKS+D+S
}"z|A2x|*u
4S,JbCS!`}v
int GetTop(Stack S,SNode &e)*lR'o _ S7c'i'Cn7`
{7F6S-s6d5O[({
if(S.top==S.base)?1qLlnW#mG)W E
{![&} H^~Xp
printf("栈以为空!");8}C6@1aXLQ ue
return -1;%sT9`X&s
}5?g'l%SCCw/TS
e=*(S.top-1);