#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <ctype.h>
#include <stdbool.h>
#define INIT_SIZE 100
#define INCRE_SIZE 10
#define OPERAND 1
#define OPERATOR 2
char _BUFFER[1000];
int _POS;
char myGetchar();
void myUnGetchar(char c);
typedef enum operator_et
{
LBR, // 左括号
RBR, // 右括号
ADD, // 加
SUB, // 减
MUL, // 乘
DIV, // 除
INV, // 乘方
SIN, // sin
COS, // cos
END // 结束标志
}operator_et;
typedef double data_t;
typedef struct cal_t
{
data_t *operand;
int *operator;
int operand_size;
int operator_size;
int operand_top;
int operator_top;
}cal_t;
typedef cal_t* cal_pt;
// 初始化栈
cal_pt calInit();
// 销毁栈
void calFree(cal_pt cal);
// 压进操作符
void calOperatorPush(operator_et operator, cal_pt cal);
// 弹出操作符
operator_et calOperatorPop(cal_pt cal);
// 压进操作数
void calOperandPush(data_t operand, cal_pt cal);
// 弹出操作数
data_t calOperandPop(cal_pt cal);
// 操作符优先级比较,优先级大于栈顶返回1,相等返回0,小于返回-1
int operatorCmp(operator_et top, operator_et op);
// 给操作数,进行计算
void work(operator_et op, cal_pt cal);
// 获取操作符或者操作数,返回类型
int getop(char *op);
// 主逻辑函数,进行运算
void calculator(cal_pt cal);
void __calculator(operator_et op, cal_pt cal);
int main()
{
cal_pt cal = calInit();
scanf("%s", _BUFFER);
_POS = 0;
calculator(cal);
// 计算完成。数据栈里唯一的数字就是所需要的数据
printf("%.3lf\n", calOperandPop(cal));
calFree(cal);
return 0;
}
void __calculator(operator_et op, cal_pt cal)
{
switch(operatorCmp(cal->operator[cal->operator_top], op))
{
case 1: // 新运算符优先级更大,压入
{
calOperatorPush(op, cal);
break;
}
case -1: // 新运算符优先级更小,弹出计算直至没有比它更大的运算符
{
do
{
work
中序计算式的计算器模型C语言实现
最新推荐文章于 2022-08-10 21:11:12 发布