[LeetCode] 227. 基本计算器 II

227.基本计算器 II

题目说明

给你一个字符串表达式 s ,请你实现一个基本计算器来计算并返回它的值。

整数除法仅保留整数部分。

示例

输入:s = “3+2*2”
输出:7

输入:s = " 3/2 "
输出:1

输入:s = " 3+5 / 2 "
输出:5

提示
  • 1 <= s.length <= 3 * 105
  • s 由整数和算符 (’+’, ‘-’, ‘*’, ‘/’) 组成,中间由一些空格隔开
  • s 表示一个 有效表达式
  • 表达式中的所有整数都是非负整数,且在范围 [0, 231 - 1] 内
  • 题目数据保证答案是一个 32-bit 整数
默认代码
int calculate(char * s){

}

解析

思路

有加减乘除四则运算,没有括号,说明优先级不会改变,那么可以先进行乘除运算,最后再将所有参数相加减。

有一个栈将这些数保存下来,最后将所有的数相加就可以。每一个数根据它的符号判断,执行不同的操作。对于加减号后面的数字,先存入栈顶,对于乘除的元素,直接进行乘除操作。

  • “+”号,压栈;
  • “-”号,取相反数后压栈;
  • “*”或“\”,取出栈顶的元素,相乘或相除后再压栈。

代码(C)

int calculate(char *s)
{
	int num = 0; //当前数字的大小
	int i;
	int n = strlen(s); //stack的长度与字符串的长度相等
	int stk[n]; //定义一个stack来存储元素,从小往大生长
	int index = 0; //记录stack栈顶位置
	char preSign = '+'; //该数字左边的符号,默认为"+"

	for (i = 0; i < n; i++) {
		if ((s[i] == ' ') && (i != n - 1)) {
			continue;
		}
		if (s[i] > 0x2f) { //数字
			num = num * 10 + (s[i] - '0');
		}
		if ((s[i] <= 0x2f) || (i == n - 1)) { //符号
			switch (preSign) {
				case '+': {
					stk[index++] = num;
					break;
				}
				case '-': {
					stk[index++] = -num;
					break;
				}
				case '*': {
					index--;
					stk[index++] *= num;
					break;
				}
				case '/': {
					index--;
					stk[index++] /= num;
					break;
				}
				default: {
					break;
				}
			}
			num = 0;
			preSign = s[i];
		}
	}

	for (i = 0; i < index; i++) {
		num += stk[i];
	}

	return num;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值