C语言表达式计算器
为了方便了解流程,在程序中把计算过程也输出了.而且栈操作的实现部分也是自己实现的.程序用两个栈,optr寄存运算符,opnd寄存操作数和运算结果.输入的表达式以等号结束,例如:2*(1+2)=3H$t5wM?-b!kIf
/**************表达式计算器************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>_a1DgN
#include <conio.h>
#include <malloc.h>
#define STACK_SIZE 100
#define APPEND_SIZE 10rKZ!X Gs
/u3N^a^I6v
struct SNode{ ^QN/w9i
float data; /*存放操作数或者计算结果*/X/?1\$^b
char ch; /*存放运算符*/g/]5{J8V;J(Qxy
}; VG8H.[O G
g9@&gKV&JB3l;?
struct Stack{Z8d R/d O7R
SNode *top;
SNode *base;/s'@pzPS#d"By.D#f
int size;
};
};H7Fu-d(^K
/*栈操作函数*/y$pi3FI4s)FYt6PO
int InitStack(Stack &S); /*创建栈*/
int DestroyStack(Stack &S); /*销毁栈*/
int ClearStack(Stack &S); /*清空栈*/ cv!t.]b@)I:r8}
int GetTop(Stack S, SNode &e); /*取出栈顶结点并返回节点值*/
int Push(Stack &S,SNode e); /*将结点e压入栈*/$Y#q,g3V?dm#tQA3Qq
int Pop(Stack &S,SNode &e); /*删除栈顶结点并返回其节点值*/6q/d0t:P.Td
6V/o'\$K$t4b7{1ES$x
/*表达式计算器相关函数*/
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计算后的结果*/ o,s9{ cV
float compute(); /*表达式结算器主函数*/
char *killzero(float result); /*去掉结果后面的0*/ 'f`.M} k Z
$m2rWGL:i
int InitStack(Stack &S)'|\Z M(BLP#oN
{
S.base=(SNode *)malloc(STACK_SIZE * sizeof(struct SNode));}Bm'E,J]/S2YQ Ad3hy
if(S.base==NULL)
{
printf("动态分配内存失败!");i L/f(ty.mo%c
return -1;
}
S.top=S.base;
S.size=STACK_SIZE;.D-] lh8o;Q
return 0;
}|"V.Ov-?
.X U`#{-Gc
int DestroyStack(Stack &S)
{A#SeMSV9a
free(S.base);
return 0;'o Q VAe;noczE
} P+mXf9u)o1m%zc
int ClearStack(Stack &S)
{*Z9n3u,WgguC&`c
S.top=S.base;
return 0;
}
int GetTop(Stack S,SNode &e)W*[ i)Q1p+E0Z%b
{5];c}C H;n8B/nr0o^
if(S.top==S.base)6pO2}e \ c
{ oB D{&L'hO3e"KI
printf("栈以为空!");
return -1;
}d,{jy4kTv
e=*(S.top-1);
return 0;b/i Fq ]7A#S;qx5lr
}
int Push(Stack &S,SNode e)
{
if(S.top-S.base>=S.size)jp_1sg5z;z5J V P
{
S.base=(SNode *)realloc(S.base,(S.size+APPEND_SIZE)*sizeof(struct SNode));6npsi2l)L+w l
if(S.base==NULL)Boh)EPB~
{
printf("动态分配内存失败!");~._B!nl h*k:W
return -1;fGT S8d$h v9?Fxo
}:FOZ|(e^ VV|5\O([
S.top=S.base+S.size;
S.size+=APPEND_SIZE; |c8f!@$\1^+J,d&S
}
*S.top=e;
S.top++; i$?t9DJ8L-|
return 0;x7o \Iw
} t%tu P Vdr;FvW
int Pop(Stack &S,SNode &e)O/E ZLz,u+Y |[
{7P\ Xj e'z!B
if(S.top==S.base)
{DW8J2h*PzZ
printf("栈为空!");;F5ph ?;S9~E
return -1;/O rk c`L
}rn|ls,X6Z c
e=*(S.top-1);Z |JR:Z1Ss z9j.Z
S.top--;
return 0;
}0l0^)OJVI
ax4OW2KXn
char get_precede(char s,char c)
{6i7t3cUe*~j
switch(s)u&Y(C@ m;a
{
case '+': /Tg/?2j9_)_y
case '-':6f t:Q*} xk E-dT
if(c=='+'||c=='-')6Da@4A0g*kG j
return '>';'F+c'g8J J0M
else if(c=='*'||c=='/')
return '<';5ke$V6n8_0P
else if(c=='(')
return '<';
else if(c==')')
return '>';-rH?%N;S+N1Z
else
return '>';
case '*':
case '/':
if(c=='+'||c=='-')
return '>';
else if(c=='*'||c=='/')%fk7hlOI~)r
return '>';/N ^'^"GV:Rq
else if(c=='(')Bo?X_:P*_$d
return '<';
else if(c==')')Z8l"c },n*qs0P6V
return '>';
elseB`5a7|H
return '>';
case '(':*KynEt}
if(c=='+'||c=='-')1`K|*OmY-J
return '<';&S`"kpFr:D%_
else if(c=='*'||c=='/')
return '<';
else if(c=='(')
return '<';Tyh-n#Q6b;sb$^;z
else if(c==')')
return '=';
else"b{cP;O$O!Dhe}
return 'E';
case ')':D,]TDofS
if(c=='+'||c=='-')C3Yw(ez?*{X,l
return '>';/[qD-C)nC
else if(c=='*'||c=='/')
return '>';
else if(c=='(')6[Rk9gW7W%X
return 'E';
else if(c==')')
return '>';
else
return '>';
case '#':
if(c=='+'||c=='-')
return '<';YhEH7C-D^
else if(c=='*'||c=='/')@X"n$BI\;|[
return '<';
else if(c=='(')
return '<';
else if(c==')')\g x K_iu8S|?[
return 'E';
else
return '=';#l{.@igd
default:4r$_? xb\i1}
break;
}ERl3n+V:V-l Ro Cg
return 0;
}
0P%\a u @'F
int isOpr(char c)X-V:no:ds*b
{
if(c=='+'||c=='-'||c=='*'||c=='/'||c=='('||c==')'||c=='=')$] ` m RA?+V
return 0;#HS9wF*wyh5dW
else
return 1; i&N3lS4`7ZFA
} l|g9RQaF
}J$V)aj;n|7[
float operate(float x, char opr, float y)W%E$qUt;T,ij
{
float result;
switch (opr)3F H;k8e|v Tw.C
{K3UCU@kt6k
case '+': )`6K#fDo8l JZr
result = x + y;
break;5L2] P#DSi| r
case '-':
result = x - y;[;^sc],m.w^g
break;i:?9k:V+ri4Tt9mE#ud
case '*':
result = x * y;
break;Xk6`w`vHz
case '/': tME^)J0Z
if (y == 0)7[sv.XX3M4EUt;O
{2@mTv Fe6J4N^
printf("Divided by zero!\n");
return 0;
}#d g4{2o wm
elsew#X yl'g&D @g
{?7z-m0E4|1u
result = x / y;QX4|7hKu
break;0n&y$N1M dVcS0@
}ofO @%[!JTdro
default:
printf("Bad Input.\n");
return 0;
}g j0_vAM;|s
return result;
}
^!i3e Md'W^v*c$Jd
float compute() /*计算的时候运算符栈顶结点的优先级始终最低*/ @-t"x0t}zPH
{
Stack optr,opnd;
struct SNode opr_in,opn_in,opr_top,opn_tmp,e,a,b,opr_t;
char c;
char buf[16];