C语言表达式计算器
为了方便了解流程,在程序中把计算过程也输出了.而且栈操作的实现部分也是自己实现的.K,sS*Mo5h A程序用两个栈,optr寄存运算符,opnd寄存操作数和运算结果.输入的表达式以等号结束,例如:2*(1+2)=8Oe!lOdJ
/**************表达式计算器************/t y!o?^+{
#include <stdio.h>
#include <stdlib.h>
#include <string.h>K jA9?UDY
#include <conio.h>
#include <malloc.h>N's9f"oqQE6x5[
#define STACK_SIZE 100
#define APPEND_SIZE 10
0]F\g-a)~~
struct SNode{
float data; /*存放操作数或者计算结果*/
char ch; /*存放运算符*/
};GM7@1e0I5G\
{oXi&T*@rhl
struct Stack{
SNode *top;#{ hO"o3EO
SNode *base;
int size;
};R7vP+gOb
g3RQ;A q'ePW
/*栈操作函数*/&HV6x@bM
int InitStack(Stack &S); /*创建栈*/
int DestroyStack(Stack &S); /*销毁栈*/
int ClearStack(Stack &S); /*清空栈*/
int GetTop(Stack S, SNode &e); /*取出栈顶结点并返回节点值*/`Zkp%f?
int Push(Stack &S,SNode e); /*将结点e压入栈*/
int Pop(Stack &S,SNode &e); /*删除栈顶结点并返回其节点值*/
/*表达式计算器相关函数*/
char get_precede(char s,char c); /*判断运算符s和c的优先级*/oX m8g,n B y3jH?
int isOpr(char c); /*判断输入的字符是不是运算符,是则返回0,否返回1*/!^!fcs4Q+E0t5`B
float operate(float x, char opr, float y); /*计算x和y经过运算符opr计算后的结果*/
float compute(); /*表达式结算器主函数*/
char *killzero(float result); /*去掉结果后面的0*/ A"hzX\
int InitStack(Stack &S)(F*sX e"u4x k%GP
{ y1p%ul` w-qX;M4A;\/I
S.base=(SNode *)malloc(STACK_SIZE * sizeof(struct SNode));n w#x w3v8k t+B y
if(S.base==NULL)
{0m6Q*`#xXR9s
printf("动态分配内存失败!");C9d5Jy \xh2Dy8W-a
return -1;
}5TLDO1@ml7do
S.top=S.base;uMq}ra
S.size=STACK_SIZE;+Y'Y'PRF@"| { N
return 0;
}
int DestroyStack(Stack &S)3|BhLk2dd$sv
{9s @7~ gs
free(S.base);
return 0;
}
;q&ux4h*X4skl
int ClearStack(Stack &S)C-TGJ5Ai_6Y
{
S.top=S.base;
return 0;-m8C[ F~c&N*j0KO1E
}
int GetTop(Stack S,SNode &e)b}|^6B&C
{
if(S.top==S.base)!M1B cq,dC ]5W
{
printf("栈以为空!");
return -1;
}k9u+I_+wr
e=*(S.top-1);z8x kVC@i
return 0;
}(]4m/XSFd+^S~
int Push(Stack &S,SNode e)
{KD2O$[0G/B
if(S.top-S.base>=S.size)wDP E$c5j k]1y}
{i[ e0N5B/u;[I
S.base=(SNode *)realloc(S.base,(S.size+APPEND_SIZE)*sizeof(struct SNode));
if(S.base==NULL)/E!^!u F s&`Q:AM
{
printf("动态分配内存失败!");L:g*blX
return -1; ]6_ v'X,~
}
S.top=S.base+S.size;
S.size+=APPEND_SIZE;
}m;^PEF)T#d
*S.top=e;+{d,vR]
S.top++;
return 0;&kF0xg3a*H
}1oY@9B-M
,ci6iD-}j:r$?
int Pop(Stack &S,SNode &e)
{ic7s9Ea5a6LU
if(S.top==S.base)r(QT h{!T
{
printf("栈为空!");:SO3v)@]"T
return -1;:A\P `^!t ikRuz
}
e=*(S.top-1);
S.top--;
return 0;
}h7w`5ZdZ
UQ,G R!Q
char get_precede(char s,char c) N7uW }I CLP$B
{
switch(s)
{
case '+':
case '-':
if(c=='+'||c=='-')[%h3}1q6_x&t3x[
return '>';6P`~ | r4| D
else if(c=='*'||c=='/')7t/O&Q%Isx&~y
return '<';H|}V*s/Qb![
else if(c=='(')4P jT!?p)x+G#|
return '<';
else if(c==')')
return '>';HN_(\B%E'J0m p8E
else
return '>';
case '*':
case '/':j|C3mQ:A`
if(c=='+'||c=='-')
return '>';;ZWt2f/a)]9yL3Ry_+Z
else if(c=='*'||c=='/')
return '>';
else if(c=='(')
return '<';jQ-HW&klH'e
else if(c==')')
return '>';
else$]|&[S:XS4J B
return '>';9HQT JE%b/@*N
case '(':
if(c=='+'||c=='-')
return '<';H#Cg5W?
else if(c=='*'||c=='/')
return '<';hDhK Q4V O E
else if(c=='(')mVtxX+p6~
return '<';Df,w{2D
else if(c==')')
return '='; a[)t-}Z
elsel*b%?dLP,z[
return 'E';
case ')':2XR*^I LFDU
if(c=='+'||c=='-')
return '>';
else if(c=='*'||c=='/')r.B M5ZC
return '>';
else if(c=='(')
return 'E';8~^ {@O'Y H2p(_)A
else if(c==')')
return '>';
elseqpT3E`Fo%~
return '>';
case '#':&d*m$f Te,G$rc
if(c=='+'||c=='-')sBZs,sd:T
return '<';
else if(c=='*'||c=='/')
return '<';
else if(c=='(')
return '<';
else if(c==')')A&WO4dQm&[
return 'E';;XYrP0h9N L2u
elsekPr ryM%Z
return '=';+\q{ i1r'c,l!w
default:`b7`#B0q2s@ gf
break;
}
return 0;
}
(wP zb)GV)F
int isOpr(char c)
{
if(c=='+'||c=='-'||c=='*'||c=='/'||c=='('||c==')'||c=='=')
return 0;GKU_1v!BT
else
return 1; H9ezY%@!EW9U\ F+r^
}{/AQq%U&r'vx
1Q4n$Z ~/Dj
float operate(float x, char opr, float y).|h.GdP
{$R.t3Y&DY%`0PT
float result;'pV{zA8g)X
switch (opr)
{5tj6^0B5t&?'n
case '+':
result = x + y;AwF0e K:G
break;
case '-':
result = x - y;
break;-p7RLs]+O%`,h:So
case '*': t iz+}[2P:x:^&_
result = x * y;
break;9mt;Vwl6u%{X v
case '/':
if (y == 0)
{%l\%O M?1e
printf("Divided by zero!\n");