中序计算式的计算器模型C语言实现

#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
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值