C语言实现简单计算器(可以处理小括号)

#include<stdio.h>
#include<string.h>
#include <malloc.h>

//数据栈
struct DigitalStack {
	int* topi;
	int* basei;
}numstack;

//符号栈
struct SymbolStack {
	char* topc;
	char* basec;
}cmainstack, stackhelp;

int CalculatBase(int* headnum, int* topnum, char* headsymbol, char* topsymbol) {
	//进行不包含括号的基本算术表达式。方法:将所有计算转化为最终的堆栈数据的值的和
	int ans = 0;
	char* thesymbol = headsymbol;
	while (thesymbol != topsymbol) {
		if (*thesymbol == '-')            //减法:被减数在数据栈的值更新为数值的相反数
			*(headnum + (thesymbol - headsymbol) + 1) *= -1;
		else if (*thesymbol == '*') {     //乘法:第一个乘数更新为0,第二个乘数更新为积
			*(headnum + (thesymbol - headsymbol) + 1) = *(headnum + (thesymbol - headsymbol) + 1) * (*(headnum + (thesymbol - headsymbol)));
			*(headnum + (thesymbol - headsymbol)) = 0;
		}
		else if (*thesymbol == '/') {     //除法:除数位置数据更新为0,被除数位置数据更新为商
			*(headnum + (thesymbol - headsymbol) + 1) = int(*(headnum + (thesymbol - headsymbol)) / (*(headnum + (thesymbol - headsymbol) + 1)));
			*(headnum + (thesymbol - headsymbol)) = 0;
		}
		thesymbol++;
	}
	//算数式全部转换为加法运算
	int* num = headnum;
	while (num != topnum)
		ans = ans + *num++;
	return ans;
}

int main() {
	numstack.basei = (int*)malloc(100 * sizeof(int));
	numstack.topi = numstack.basei;
	cmainstack.basec = (char*)malloc(100 * sizeof(char));
	cmainstack.topc = cmainstack.basec;

	char str[100];
	gets_s(str);
	int len = strlen(str);
	str[len] = '\0';
	int ans = 0;
	for (int i = 0; i < len; i++) {
		if (str[i] <= '9' && str[i] >= '0') {
			*numstack.topi = str[i] - '0';
			if (i + 1 < len && (str[i + 1] <= '9' || str[i + 1] >= '0')) {
				int j = 1;
				while (i + j < len && str[i + j] <= '9' && str[i + j] >= '0')
					*numstack.topi = 10 * (*numstack.topi) + (str[i + j++] - '0');
				i = i + j - 1;
			}
			numstack.topi++;
		}
		else if (str[i] == '+' || str[i] == '-' || str[i] == '*' || str[i] == '/' || str[i] == '(')//基本运算符号,依次放入符号栈中
			*cmainstack.topc++ = str[i];
		else if (str[i] == ')') {
			//处理括号内的算术式
			char* findl = cmainstack.topc;
			while (*findl != '(')
				findl--;
			int* lnum = numstack.topi - (cmainstack.topc - findl);
			int ans = CalculatBase(lnum, numstack.topi, findl + 1, cmainstack.topc);
			//把括号内数据放入数据栈,更新符号栈,注意符号栈顶部的'('
			numstack.topi = lnum;
			*numstack.topi++ = ans;
			cmainstack.topc = findl;
		}
		else if (str[i] == '=')//输出计算结果
			ans = CalculatBase(numstack.basei, numstack.topi, cmainstack.basec, cmainstack.topc);
	}
	printf("%d", ans);
}

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值