C语言表达式求值
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
/*
表达式求值,输入一个表达式,如1+2*3#,程序可计算出结果为7
支持以下符号:
+ - * / ( ) ^ .
可以计算整数、小数
其中^表示次方,2^5表示2的5次方
*/
/*头文件*/
#include <>
#include <>
#include <>
#include <>
#include <>
/*宏定义*/
#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)
{
= (double*) malloc(INIT_STACK_SIZE * sizeof(double));
= ;
= INIT_STACK_SIZE;
}
/*初始化字符栈*/
void initStackC(SqStackC &S)
{
= (char*) malloc(INIT_STACK_SIZE * sizeof(char));
= ;
= INIT_STACK_SIZE;
}
/*向数字栈中存放数字*/
void pushN(SqStackN &S, double x)
{
if >=
*++) = x;
}
/*向字符栈中存放字符*/
void pushC(SqStackC &S, char x)
{
if - >=
return;
*++) = x;
}
/*从数字栈中取出数字*/
void popN(SqStackN &S, double &x)
{
if ==
return;
x = *;
}
/*从字符栈中取出字符*/
void popC(SqStackC &S, char &x)
{
if ==
return;
x = *;
}
/*这个函数返回a operation b的值。假如operation为'+',则返回a+b的值*/ double calculate(double a, char operation, double b)
{
/*判断operation,返回对应的计算结果*/
switch (operation) {
case '+':
return a + b;
case '-':
return b - a;
case '*':
return a * b;
case '/':
return b / a;
case '^':
return pow(b, a);
default: