面试算法题C++ 系列计算器
1、力扣224基本计算器
给你一个字符串表达式 s ,请你实现一个基本计算器来计算并返回它的值。
注意:不允许使用任何将字符串作为数学表达式计算的内置函数,比如 eval() 。
提示:
1 <= s.length <= 3 * 105
s 由数字、‘+’、‘-’、‘(’、‘)’、和 ’ ’ 组成
s 表示一个有效的表达式
‘+’ 不能用作一元运算(例如, “+1” 和 “+(2 + 3)” 无效)
‘-’ 可以用作一元运算(即 “-1” 和 “-(2 + 3)” 是有效的)
输入中不存在两个连续的操作符
每个数字和运行的计算将适合于一个有符号的 32位 整数
来源:力扣(LeetCode)
class Solution {
public:
int calculate(string s) {
stack<int> ops;
ops.push(1);
int sign=1,ret=0,int n=s.size(),i=0;
while(i<n){
if(s[i]==' '){
i++;
}else if(s[i]=='+'){
sign=ops.top();
i++;
}else if(s[i]=='-'){
sign=-ops.top();
i++;
}else if(s[i]=='('){
ops.push(sign);
i++;
}else if(s[i]==')'){
ops.pop();
i++;
}else{
long num=0;
while(s[i]>='0'&&s[i]<='9' && i<n){
num=num*10+s[i]-'0';
i++;
}
if(num>INT_MAX){
return -1;
}
ret+=sign*num;
}
}
return ret;
}
};
2、常规计算器(笔试遇到)
#include <ios>
#include <iostream>
#include <string>
#include <unordered_map>
#include <vector>
#include <algorithm>
#include <stack>
#include<numeric>
using namespace std;
//样例测试输入:((5+2*3)/2+6%2)-2
int cal(string s) {
int n = s.size();
int num = 0, curRes = 0, res = 0;
char op = '+';
if (s[0] == ')' || s[0] == '*' || s[0] == '/' || s[0] == '%') {
cout<< "格式非法"<<endl;
return;
}
for (int i = 0; i < n; ++i) {
char c = s[i];
if (c >= '0' && c <= '9') {
num = num * 10 + c - '0';
}
else if (c == '(') {
int j = i, cnt = 0;
for (; i < n; ++i) {
if (s[i] == '(') ++cnt;
if (s[i] == ')') --cnt;
if (cnt == 0) break;
}
num = cal(s.substr(j + 1, i - j - 1));
}
if (c == '+' || c == '-' || c == '*' || c == '/' || c == '%' || i == n - 1) {
switch (op) {
case '+': curRes += num; break;
case '-': curRes -= num; break;
case '*': curRes *= num; break;
case '/': curRes /= num; break;
case '%': curRes %= num; break;
}
if (c == '+' || c == '-' || i == n - 1) {
res += curRes;
curRes = 0;
}
op = c;
num = 0;
}
}
return res;
}
int main() {
string str;
//cin >> str;
cout<<"answer:"<<cal(str) << endl;
return 0;
}