C语言表达式计算器
为了方便了解流程,在程序中把计算过程也输出了.而且栈操作的实现部分也是自己实现的.7Q3n z:\S [U+s!W程序用两个栈,optr寄存运算符,opnd寄存操作数和运算结果.输入的表达式以等号结束,例如:2*(1+2)=
/**************表达式计算器************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>Vh&QH9q;b
#include <conio.h>&{}d9x'la$U*~F
#include <malloc.h>1g:{L.cS\wC1v
#define STACK_SIZE 100!x`_3}^+k5n.w
#define APPEND_SIZE 10
struct SNode{
float data; /*存放操作数或者计算结果*/
char ch; /*存放运算符*/)|$kk5@ DF7y
};DL#y(_ \8s&x
R+Go Wea3s
struct Stack{g P3V-\;w:?*^)@^
SNode *top;
SNode *base;
int size;
};
C!vj~6g/c^L&{)TS%W
/*栈操作函数*/;S*LcMB5X!Im
int InitStack(Stack &S); /*创建栈*/
int DestroyStack(Stack &S); /*销毁栈*/
int ClearStack(Stack &S); /*清空栈*/
int GetTop(Stack S, SNode &e); /*取出栈顶结点并返回节点值*/8j \wa9A*H7X;{
int Push(Stack &S,SNode e); /*将结点e压入栈*/5z ~%zmb"N_C xR
int Pop(Stack &S,SNode &e); /*删除栈顶结点并返回其节点值*/
:kN/z&f9_v
/*表达式计算器相关函数*/
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计算后的结果*/k5JvF{rW
float compute(); /*表达式结算器主函数*/
char *killzero(float result); /*去掉结果后面的0*/ 'xFT'|/Xb
int InitStack(Stack &S)
{
S.base=(SNode *)malloc(STACK_SIZE * sizeof(struct SNode));Z q+hw5S'[
if(S.base==NULL)5B:aY HuV$K}d
{
printf("动态分配内存失败!");
return -1;(l c.zaEl0B!a
}
S.top=S.base;f7_O*CN.\ P@
S.size=STACK_SIZE;{Jwz3A.m&?"~$t
return 0;wM2d!s7CYxE
}
7F6@G w'i:\KH RC
int DestroyStack(Stack &S)
{$gGx#l3W
free(S.base);
return 0;O'_8?5kCzL
};K!godje z
E$n+c8r_`w@I
int ClearStack(Stack &S)
{/^Q+B^3P:N.T Ht6|
S.top=S.base;
return 0;
}
)C6JVN_"O5`(R
int GetTop(Stack S,SNode &e)/t4MIKJ f:B
{}b8fG^ C`Z
if(S.top==S.base)
{
printf("栈以为空!");#z;Q!Iq'x*c|
return -1;
}0P_%D2b0}*Yeo;J\y
e=*(S.top-1);
return 0;