C语言表达式计算器
为了方便了解流程,在程序中把计算过程也输出了.而且栈操作的实现部分也是自己实现的.8k8S O/iOT程序用两个栈,optr寄存运算符,opnd寄存操作数和运算结果.输入的表达式以等号结束,例如:2*(1+2)=*R&wXB@(}WA*^.tm
/**************表达式计算器************/(X4D}0vV m Zx
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>0b-dS0Nm;t
#include <malloc.h>
#define STACK_SIZE 100
#define APPEND_SIZE 10
struct SNode{g|.ANm,M h
float data; /*存放操作数或者计算结果*/
char ch; /*存放运算符*/&c,hc3U+J?H
};
struct Stack{/M/nBV3C&x`*Wo
SNode *top;
SNode *base;l#y&MVl4J%x
int size;o/F_0T2Kx#n {v
};W%f(v6YP9k+@
id0R#Kr.@f;M
/*栈操作函数*/*F F"moN[9m\2K%T
int InitStack(Stack &S); /*创建栈*/gp;s?.[1?!q I
int DestroyStack(Stack &S); /*销毁栈*/
int ClearStack(Stack &S); /*清空栈*/
int GetTop(Stack S, SNode &e); /*取出栈顶结点并返回节点值*/d'H b q7jz-R&u
int Push(Stack &S,SNode e); /*将结点e压入栈*/
int Pop(Stack &S,SNode &e); /*删除栈顶结点并返回其节点值*/,~!|Ai#wD f
/*表达式计算器相关函数*/
char get_precede(char s,char c); /*判断运算符s和c的优先级*/
int isOpr(char c); /*判断输入的字符是不是运算符,是则返回0,否返回1*/uQ F M.i'vf.Z,N_
float operate(float x, char opr, float y); /*计算x和y经过运算符opr计算后的结果*/
float compute(); /*表达式结算器主函数*/
char *killzero(float result); /*去掉结果后面的0*/
int InitStack(Stack &S)LH)H)q3D"S-K6BR` A
{sGx4Oo}Crz k2\1_
S.base=(SNode *)malloc(STACK_SIZE * sizeof(struct SNode));^$H8]F'SH8j
if(S.base==NULL)
{
printf("动态分配内存失败!");
return -1;INNV0cC)x
}
S.top=S.base;
S.size=STACK_SIZE;gS&s{"wc9IPE
return 0;
}sO'whj6w+b
int DestroyStack(Stack &S)
{z` Fnzp
free(S.base);:u ~YoZYo@
return 0;
}
WZGFP^
int ClearStack(Stack &S)
{
S.top=S.base;
return 0;:Xx lf_Usz*P7l
}1O)ID7mk
~4hHW"p;u
int GetTop(Stack S,SNode &e)
{+DQ"F5yq-d
if(S.top==S.base)
{
printf("栈以为空!");
return -1;r6s)Y|H:F
}WW"f:E%y7|N
e=*(S.top-1);` I!j\MkIO
return 0;pbQu.AT
}
int Push(Stack &S,SNode e)8g2M b;O(d!W8]S%{
{$w,a,iM'cc
if(S.top-S.base>=S.size)7^)Bz:g7qZ
{b5V&H6\| [z'N)@
S.base=(SNode *)realloc(S.base,(S.size+APPEND_SIZE)*sizeof(struct SNode));
if(S.base==NULL)x,K,b4rx_
{5_\nO`$^y R4h
printf("动态分配内存失败!");.u@a MX#c
return -1;%~QIBCL4cY/c
}
S.top=S.base+S.size;
S.size+=APPEND_SIZE;e\#w(Tu.pQ'n
}
*S.top=e;
S.top++;
return 0;
}!z,T Z!c @iL;M(k
BH.Sw&mmL1g:[9X&s
int Pop(Stack &S,SNode &e)
{zj*T ~.k7^sf
if(S.top==S.base)
{
printf("栈为空!");;_VD;bk p
return -1;
}6A6`7B*V$fl"|A:m
e=*(S.top-1);
S.top--;
return 0;}7C-{Mf!nR
}v!|(Wg;~#@7pn A(E
char get_precede(char s,char c)-{r)Ih3V]tB1n
{Mj7A)qvYl.u
switch(s)
{
case '+':
case '-':
if(c=='+'||c=='-')pb-^h fd#rS
return '>';$U)Y\8[6An/X"q+A
else if(c=='*'||c=='/')
return '<';
else if(c=='(')sF2~&J5tB
return '<';C oZf ~#V
else if(c==')')
return '>';
else
return '>';
case '*':
case '/':
if(c=='+'||c=='-')-iLWr$Fe
return '>';
else if(c=='*'||c=='/')
return '>';
else if(c=='(')XK ~r$?W$d ^
return '<';-o+d&N&k)cdz1i j
else if(c==')')
return '>';
else
return '>';.OI}8]H,Dwe
case '(':
if(c=='+'||c=='-')5B)l k x/}k]
return '<';K+v(ykRu|-B|
else if(c=='*'||c=='/')F5onb~z\3X4n
return '<';
else if(c=='(')N6X,w'\H#X
return '<';
else if(c==')')
return '=';
else
return 'E';"RS ^:x4xP
case ')':
if(c=='+'||c=='-')
return '>';
else if(c=='*'||c=='/')w!q$EQ5G7v%]
return '>';VQi0G/VV?+R
else if(c=='(')LlBI p2mR
return 'E';
else if(c==')')1`-?9t4nS.L-x1h
return '>';
else
return '>';
case '#':
if(c=='+'||c=='-')
return '<';
else if(c=='*'||c=='/')2M2m A ^z6{l:u Z
return '<';
else if(c=='(') UW-P*P:vt%G
return '<';
else if(c==')')
return 'E';jCM[ Y0bT y~&c
else
return '=';n C)tbEOT
default:c-cTl5h$K,v0Sd._K
break;
}a:b/p)F&jo2jLi4Ky
return 0;
}+R!p#SO%Cd{kQA
P gRxf(O
int isOpr(char c)XtB1g2YQT
{c8G(ev_0E~`!z
if(c=='+'||c=='-'||c=='*'||c=='/'||c=='('||c==')'||c=='=')gi On9Q BNN
return 0;'Z"` JLh Fs `%L#Q
else
return 1;
}1uJ&@@V3s$M+Gpd
float operate(float x, char opr, float y)fn(G#ry
{