C语言表达式计算器
为了方便了解流程,在程序中把计算过程也输出了.而且栈操作的实现部分也是自己实现的.A7L1wI.e"|程序用两个栈,optr寄存运算符,opnd寄存操作数和运算结果.输入的表达式以等号结束,例如:2*(1+2)=
/**************表达式计算器************//};NeHTM H4i/s7E
#include <stdio.h>?C6s:n F
#include <stdlib.h>'b/VSZx-XTG+@
#include <string.h> i%f)a)Im F
#include <conio.h>
#include <malloc.h>
#define STACK_SIZE 100gq-S#zv4b8e`
#define APPEND_SIZE 10Z vE*cz0y
ca&J K;J2Kg0e8SW
struct SNode{#F!RxC9`J6_
float data; /*存放操作数或者计算结果*/0q/L`9R%]fp.[S
char ch; /*存放运算符*/
};oARMos
_J q!e hC.@
struct Stack{
SNode *top;m"GZ[E)F
SNode *base;
int size;-P8F+c,w,j(ex'[7H
};]+wtVF!A
/*栈操作函数*/8i'i3H]Xc
int InitStack(Stack &S); /*创建栈*/
int DestroyStack(Stack &S); /*销毁栈*/
int ClearStack(Stack &S); /*清空栈*/
int GetTop(Stack S, SNode &e); /*取出栈顶结点并返回节点值*/
int Push(Stack &S,SNode e); /*将结点e压入栈*/o5vw[ T6rC B^
int Pop(Stack &S,SNode &e); /*删除栈顶结点并返回其节点值*/2b d:b9om
9v@m*k8n$F?;[
/*表达式计算器相关函数*/&I'Lv T8}Oz
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计算后的结果*/
float compute(); /*表达式结算器主函数*/2V6}_A&W1C;s,i
char *killzero(float result); /*去掉结果后面的0*/
int InitStack(Stack &S)L'kfb&\f5xG
{0k1wvMj
S.base=(SNode *)malloc(STACK_SIZE * sizeof(struct SNode));
if(S.base==NULL)
{c#m/`$kM{%x-MM
printf("动态分配内存失败!");3Hi.N0Lh*OqB \D
return -1; pr/SOdy^!R/r
}
S.top=S.base;
S.size=STACK_SIZE; e/s"G#},Z G
return 0;N"_Z xl!DX
}K` jK0n4U5V:ay;|;E
7v1L"mG7xl'h
int DestroyStack(Stack &S)#}X1}1Cxa
{
free(S.base);JldD[8Q
return 0;
}m(S-n.b$c4q{$k;m
int ClearStack(Stack &S)
{&A&?;w"b8c]#V
S.top=S.base;:z:_+C\5Mq
return 0;
})CI+{ Hk Gy~
]/xGH q3k/^ y
int GetTop(Stack S,SNode &e)
{9J U:H p{5ma
if(S.top==S.base)(ENc,T0lGQv#X
{
printf("栈以为空!");%\o!@C6K3Z
return -1;/pL`y2J Zbhq7B
}B+n:C1Wb%`2b%N
e=*(S.top-1);B ` ~Q0JP)x
return 0;
}1`(c"fTUR1P3?'WF
Yd ^/_G%`
int Push(Stack &S,SNode e)Yg Ud7Xr
{
if(S.top-S.base>=S.size)
{7],q BC)~H,poc5n
S.base=(SNode *)realloc(S.base,(S.size+APPEND_SIZE)*sizeof(struct SNode)); @vkWtO-sW
if(S.base==NULL)
{uYF/?3zX1y&W"J:Q
printf("动态分配内存失败!");,Y Sy;F2g:bwg&p
return -1;%L#w.?)ai-Zu9u
}({5qf`:Cf7e} gB
S.top=S.base+S.size;
S.size+=APPEND_SIZE;J2DI$l(S"c#]5K8lMM L
}SlG:e+Ua%xm
*S.top=e;thW;u/?*ohQ
S.top++;