C语言表达式求值(带详细注释).doc
文本预览下载声明
/*
表达式求值,输入一个表达式,如1+2*3#,程序可计算出结果为7
支持以下符号:
+ - * / ( ) ^ .
可以计算整数、小数
其中^表示次方,2^5表示2的5次方
*/
/*头文件*/
#include stdio.h
#include malloc.h
#include string.h
#include math.h
#include stdlib.h
/*宏定义*/
#define INIT_STACK_SIZE 100
#define SET_NUM 8
#define N 100
/*字符优先级表*/
unsigned char prior[SET_NUM][SET_NUM] =
{
/* + - * / ( ) # ^ */
/*+*/, , , , , , , ,
/*-*/, , , , , , , ,
/***/, , , , , , , ,
/*/*/, , , , , , , ,
/*(*/, , , , , =, , ,
/*)*/, , , , , , , ,
/*#*/, , , , , , =, ,
/*^*/, , , , , , ,
};
unsigned char priorSet[SET_NUM] = {+, -, *, /, (, ), #, ^};
/*结构体定义,这是用来存放字符的栈*/
typedef struct
{
char *base;
char *top;
int stacksize;
} SqStackC;
/*结构体定义,这是用来存放数字的栈*/
typedef struct
{
double *base;
double *top;
int stacksize;
} SqStackN;
void initStackN(SqStackN );
void initStackC(SqStackC );
void pushN(SqStackN , double);
void pushC(SqStackN , double);
void popN(SqStackN , double );
void popC(SqStackN , double );
double calculate(double, char, double);
int findInSet(char);
char compare(char, char);
void getSolution();
/*主函数*/
void main()
{
getSolution();
}
/*初始化数字栈*/
void initStackN(SqStackN S)
{
S.base = (double*) malloc(INIT_STACK_SIZE * sizeof(double));
S.top = S.base;
S.stacksize = INIT_STACK_SIZE;
}
/*初始化字符栈*/
void initStackC(SqStackC S)
{
S.base = (char*) malloc(INIT_STACK_SIZE * sizeof(char));
S.top = S.base;
S.stacksize = INIT_STACK_SIZE;
}
/*向数字栈中存放数字*/
void pushN(SqStackN S, double x)
{
if (S.top-S.base = S.stacksize)
return;
*(S.top++) = x;
}
/*向字符栈中存放字符*/
void pushC(SqStackC S, char x)
{
if (S.top - S.base = S.stacksize)
return;
*(S.top++) = x;
}
/*从数字栈中取出数字*/
void popN(SqStackN S, double x)
{
if (S.top==S.base)
return;
x = *(--S.top);
}
/*从字符栈中取出字符*/
void popC(SqStackC S, char x)
{
if (S.top == S.base)
return;
x = *(--S.top);
}
/*这个函数返回a operation b的值。假如operation为+,则返回a+b的值*/
double calculate(double a, char operation
显示全部