C语言表达式计算器
为了方便了解流程,在程序中把计算过程也输出了.而且栈操作的实现部分也是自己实现的.程序用两个栈,optr寄存运算符,opnd寄存操作数和运算结果.输入的表达式以等号结束,例如:2*(1+2)=
/**************表达式计算器************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>fL{ k.sdg)Rsj
#include <malloc.h>3Q}c$\1K%Q
#define STACK_SIZE 100I-cbL)E-E _^N~
#define APPEND_SIZE 10
eX2SH A0Cb
struct SNode{D-F:?8R`({
float data; /*存放操作数或者计算结果*/5S g|3v NLo)j
char ch; /*存放运算符*/(|Rs |&T|
};
struct Stack{3Gw^$G"~o"|:V]9p
SNode *top;
SNode *base;v;Sc"|#Vf; /*计算x和y经过运算符opr计算后的结果*/
float compute(); /*表达式结算器主函数*/;H*duJ'^EV ~.Fe0J
char *killzero(float result); /*去掉结果后面的0*/ (~L@9K%L*s'q
#j5y{k5p.VXG3f
int InitStack(Stack &S):t!`D$gX^
{
S.base=(SNode *)malloc(STACK_SIZE * sizeof(struct SNode));#vu%DD+Q'I)c#YVL
if(S.base==NULL)%t.XdzQp)T
{
printf("动态分配内存失败!");9|2u5s;g0K0\W.C
return -1;:H}/i s-y R8y8l R
}
S.top=S.base;K'T lSN(h
S.size=STACK_SIZE;
return 0;
}
s)tJ3e`X^
int DestroyStack(Stack &S).TW:s iU+UY,k M
{;pX \2K9wB8Z,u
free(S.base);'r-oh,z0pw9`J
return 0; ^k S~N~La'l#n
}
E;@%h hwOr w7|
int ClearStack(Stack &S)(F/h/Jn9ly
{?:sr2]l Y2S*Ho}
S.top=S.base; m'T)V^:B6e!\c6rH*@
return 0; S2H~0~/n
}Eb^3V?-I"B2e
~iVA)Wx0m2G
int GetTop(Stack S,SNode &e)
{dC G|:O!kI!Yi
if(S.top==S.base)|ft!ep\1j'sp5hh
{6W*Vj+H%l ZO.Zv
printf("栈以为空!");i"KMak,p/s$t-Gq
return -1;m3lI+V+]?o%~]
}(o#Max.P`AJ
e=*(S.top-1);[J[K7rPD8wH
return 0;4TH{Fch4A#s;iT
}
DB/?_G U%b
int Push(Stack &S,SNode e)$A#c7Kq ?4I)k4b
{i'N4ycoV
if(S.top-S.base>=S.size)Q?~g [h2}
{ sa`e1z4P
S.base=(SNode *)realloc(S.base,(S.size+APPEND_SIZE)*sizeof(struct SNode));`6Y@_"f9TUfP
if(S.base==NULL)
{'V kP\#[
printf("动态分配内存失败!");Z'c#K4b]9Y
return -1;
}
S.top=S.base+S.size;#X_-yu9sH'RV#k1Kv
S.size+=APPEND_SIZE;l7Q8TRW
}
*S.top=e;
S.top++;
return 0;
}1`!Xi!ukc
int Pop(Stack &S,SNode &e)
{g } Hk M6\
if(S.top==S.base)A7AGE%J3q.g ]%]HKF
{
printf("栈为空!");y;ES8{Crk
return -1;5j3W fwOfP9d3e3c
}+{*^`"_5N0L(r
e=*(S.top-1);
S.top--;Ve1s7ay/@T7G+wTQRo
return 0;
}
^q&t S L:m!T*~(j
char get_precede(char s,char c))u%p4@pw iG#o}3E0^8Z
{
switch(s)
{kB/N F)pz [
case '+':
case '-':
if(c=='+'||c=='-')
return '>';u&deo4_%c)H6vm,H
else if(c=='*'||c=='/')6T1K0e/m;|MP}f2g
return '<';
else if(c=='(')o t2Gf Oy0G ]
return '<';
else if(c==')')
return '>';
else ?Uw2uW
return '>';7i%? ?xT z}:lP
case '*':
case '/':7@?(G$Ph/a
if(c=='+'||c=='-')K!HV'B3EV*a5Q]e]
return '>';k;ipJO
else if(c=='*'||c=='/')9M ~v1h&h!Y
return '>';
else if(c=='(')G6p p9d1@q&J)y
return '<';Y)W e3}f5F_ g0_MzE
else if(c==')')&x]'X{3K
return '>';\}|[UJ0r&B&e
else
return '>';[+gh'gf;\A0o9\2e'|xn
case '(':]6ju4[,W(BX$B6u8l
if(c=='+'||c=='-')uw'J8@ch
return '<';
else if(c=='*'||c=='/')6DP/eUc un
return '<';
else if(c=='(')
return '<';5^E*v*Hqt9wI
else if(c==')')