C语言表达式计算器
为了方便了解流程,在程序中把计算过程也输出了.而且栈操作的实现部分也是自己实现的.程序用两个栈,optr寄存运算符,opnd寄存操作数和运算结果.输入的表达式以等号结束,例如:2*(1+2)=0DKf0c_\2jT)DK"N0?
/**************表达式计算器************/#n a2C$F F*[
#include <stdio.h>
#include <stdlib.h>_Ac:I3K-`
#include <string.h>
#include <conio.h>YJ1E C0R9\U_Q
#include <malloc.h> vS|8kh
#define STACK_SIZE 100
#define APPEND_SIZE 10
struct SNode{
float data; /*存放操作数或者计算结果*/
char ch; /*存放运算符*/
};
x@LiN,@[$T
struct Stack{
SNode *top;@|+I*N5J
SNode *base;7s1s!V0P$BCh:e#ui8[
int size;_d w:aYQu&t
};iN(b7] Gq
/*栈操作函数*/
int InitStack(Stack &S); /*创建栈*/
int DestroyStack(Stack &S); /*销毁栈*/
int ClearStack(Stack &S); /*清空栈*/
int GetTop(Stack S, SNode &e); /*取出栈顶结点并返回节点值*/
int Push(Stack &S,SNode e); /*将结点e压入栈*/ Q }B O-`"[}e
int Pop(Stack &S,SNode &e); /*删除栈顶结点并返回其节点值*/
6\0cO9bZ2H`d5L
/*表达式计算器相关函数*/`8[k;DN(POi!C
char get_precede(char s,char c); /*判断运算符s和c的优先级*/1fn J r8gH#O
int isOpr(char c); /*判断输入的字符是不是运算符,是则返回0,否返回1*/
float operate(float x, char opr, float y); /*计算x和y经过运算符opr计算后的结果*/
float compute(); /*表达式结算器主函数*/+P g9G.]+ZpSD6h
char *killzero(float result); /*去掉结果后面的0*/
int InitStack(Stack &S)6RLctQ,]}XJ@a
{
S.base=(SNode *)malloc(STACK_SIZE * sizeof(struct SNode));OiA.c9\
if(S.base==NULL)
{
printf("动态分配内存失败!");o8T.]zn M!y`
return -1;5?5\.}t&@ h+w8i4_7x
} X^xu$OP2c7@
S.top=S.base;
S.size=STACK_SIZE;8h"H%sU\ QoQ
return 0;
}
4VR g WL3FO,_
int DestroyStack(Stack &S)
{wR8p7{S3n7`
free(S.base);
return 0;g#I5cnO{
}N'D&UYc4`
'{H0RU5LH5g+A
int ClearStack(Stack &S),M ]2V!K-Fc5N
{
S.top=S.base;'h/hhqp-S
return 0;NY ph"Q({,D
}R-]W,k1JRA(?Tf9h&g
1a1}6V7\H;F
int GetTop(Stack S,SNode &e)/VnH&sMR~F
{!vczn^u,db]
if(S.top==S.base)~7eBc[We
{