请写一个整数计算器,支持加减乘三种运算和括号。
数据范围:
,保证计算结果始终在整型范围内
要求:空间复杂度:
,时间复杂度
# # 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 # # 返回表达式的值 # @param s string字符串 待计算的表达式 # @return int整型 # class Solution: def solve(self , s: str) -> int: # write code here # 实施运算的操作函数 def apply_op(a,b,op): if op == "+":return a+b if op == "-":return a-b if op == "*":return a*b # 运算符优先级赋值 def procal(op): if op in ("+","-"):return 1 if op == "*": return 2 return 0 # 设置两个栈,分别为数值栈和运算符栈 num_stack = [] op_stack = [] # 用于累积总处理的字符数值,包括数字和运算符 i = 0 while i < len(s): # 判断该字符是否为数字 if s[i].isdigit(): num = 0 # 对于数字超过1位数的计算数进行累加起来,整合成真正需要计算的数 while i < len(s) and s[i].isdigit(): num = num *10 + int(s[i]) i += 1 # 将需要计算的数字添加到数值栈 num_stack.append(num) # 对于优先级最高的括号,进行匹配和优先运算 elif s[i] == "(": op_stack.append(s[i]) i += 1 elif s[i] == ")": while op_stack[-1] != "(": num1 = int(num_stack.pop()) num2 = num_stack.pop() op = op_stack.pop() num_stack.append(apply_op(num2,num1,op)) op_stack.pop() i += 1 # 按照优先级,优先级更高的先进行运算 elif s[i] in ("+","-","*"): while (op_stack and procal(op_stack[-1])>=procal(s[i])): num1 = num_stack.pop() num2 = num_stack.pop() op = op_stack.pop() num_stack.append(apply_op(num2,num1,op)) op_stack.append(s[i]) i += 1 # 不属于上述的情况,就字符会被压入 else: i += 1 # 最后把字符串s都遍历完了,最后还没有进行运算的,循环进行运算,最后结果放在数字栈内 while op_stack: num1 = num_stack.pop() num2 = num_stack.pop() op = op_stack.pop() num_stack.append(apply_op(num2,num1,op)) results = int(num_stack[0]) return results if __name__ == "__main__": s = str(input().strip().replace('"','')) print(Solution().solve(s))
# # 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 # # 返回表达式的值 # @param s string字符串 待计算的表达式 # @return int整型 # class Solution: def solve(self , s) -> int: # write code here num_stack = [] op_stack = [] s = [_ for _ in s.replace(" ", "")] num = "" positive = True i = 0 if s[0] == '-': i = 1 positive = False while i < len(s): if s[i] in "0123456789": num += s[i] else: if num != "": num = int(num) if not positive: num = num * (-1) num_stack.append(num) num = "" positive = True if s[i] == "(": op_stack.append(s[i]) elif s[i] == ')': tmp_op_stack = [] tmp_num_stack = [num_stack.pop()] while True: curr_op = op_stack.pop() if curr_op == '(': break tmp_op_stack.append(curr_op) tmp_num_stack.append(num_stack.pop()) num_stack.append( self.solve_wo_bracket( self.inverse_list(tmp_num_stack), self.inverse_list(tmp_op_stack), )[0] ) elif s[i] in "+-*/": if s[i] == '-' and s[i-1] == "(": positive = False else: op_stack.append(s[i]) i += 1 if num: num = int(num) if not positive: num = num * (-1) num_stack.append(num) num = "" positive = True return self.solve_wo_bracket(num_stack, op_stack)[0] def solve_wo_bracket(self, num_stack, op_stack) -> int: print(num_stack) print(op_stack) assert "(" not in op_stack and ")" not in op_stack while op_stack: curr_op = op_stack.pop() latter = num_stack.pop() former = num_stack.pop() if curr_op in "*/": if curr_op == '*': res = former * latter else: res = former / latter num_stack.append(int(res)) else: if op_stack: num_stack.append(former) former, num_stack, op_stack = self.solve_wo_bracket(num_stack, op_stack) if curr_op == '+': res = former + latter else: res = former - latter num_stack.append(int(res)) else: if curr_op == '+': num_stack.append(former + latter) else: num_stack.append(former - latter) res = num_stack.pop() # print(res) # print() return res, num_stack, op_stack def inverse_list(self, l): length = len(l) for i in range(int(length/2)): tmp = l[i] l[i] = l[length-i-1] l[length-i-1] = tmp return l
class Solution: def solve(self , s: str) -> int: # write code here return self.solve1(s)[0] def solve1(self, s: str,flag=False,minor=False) : # write code here i = 0 res = 0 left = 0 stack1 = [] last = 0 while i < len(s): # print(s[i],i,res) # time.sleep(0.1) while s[i] == '('&nbs***bsp;stack1: if s[i]=='(': if not stack1: left = i + 1 stack1.append('(') if s[i] == ')': stack1.pop() if not stack1: res,off = self.solve1(s[left:i]) # result i=left+off+1 break i += 1 if i>=len(s): break if s[i] == '*': temp,off = self.solve1(s[i + 1:],True) res = res * temp elif s[i] == '+': temp, off = self.solve1(s[i + 1:]) res = res + temp elif s[i] == '-': temp, off = self.solve1(s[i + 1:],minor=True) res = res - temp else: res, off = self.find_digit(s[i:]) i= i+off+1 if flag: return res,i elif minor: if i<len(s) and s[i]!='*': return res,i return res,i def find_digit(self, s): res = '' i = 0 for i, v in enumerate(s): if v >= '0' and v <= '9': res += v else: return int(res) if res else 0, i-1 break return int(res) if res else 0, i
# # 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 # # 返回表达式的值 # @param s string字符串 待计算的表达式 # @return int整型 class Solution: def solve(self , s: str) -> int: class Stack(object): def __init__(self) -> None: self.item = [] def push(self, node): self.item.append(node) def pop(self): return self.item.pop() def top(self): return self.item[-1] def isEmpty(self): if self.item == []: return True else: return False def get_num(item, s) -> tuple(): li = [int(item)] while s: if s[0].isdigit(): li.append(int(s[0])) s = s[1:] else: break num = 0 for i in range(len(li)): num += li[i] * 10 ** (len(li)-i-1) return num, s def cal_bracket(s) -> tuple(): stack_str = Stack() stack_num = Stack() while s: item, s = s[0], s[1:] if item == '(': num, s = cal_bracket(s) stack_num.push(num) elif item == ')': return (sum(stack_num.item), s) # 本cal_bracket结束,返回: ()计算值,新的s elif item == '*': if s[0] == '(': num, s = cal_bracket(s[1:]) stack_num.push(stack_num.pop() * num) elif s[0].isdigit(): num, s = get_num(s[0], s[1:]) stack_num.push(stack_num.pop() * num) elif item == '+': pass elif item == '-': if s[0] == '(': num, s = cal_bracket(s[1:]) stack_num.push(-num) elif s[0].isdigit(): num, s = get_num(s[0], s[1:]) stack_num.push(-num) elif item.isdigit(): num, s = get_num(item, s) stack_num.push(num) s = s + ')' return cal_bracket(s)[0]
# # 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 # # 返回表达式的值 # @param s string字符串 待计算的表达式 # @return int整型 # #中缀表达式问题 class Solution: def solve(self , s: str) -> int: # 定义优先级 level = { '*': 2, '-': 1, '+': 1, '(': 3, ')': -1 } num = [] signal = [] # write code here signal.append('(') s = s + ')' l = len(s) i = 0 while i < l: t = i while(s[t].isdigit()): t = t + 1 if(t != i): num.append(int(s[i:t])) i = t continue if(signal[-1] == '(' and s[i] != ')'): signal.append(s[i]) i = i + 1 elif (level[s[i]] > level[signal[-1]]): signal.append(s[i]) i = i + 1 elif (level[s[i]] <= level[signal[-1]]): if (s[i] == ')' and signal[-1] == '('): signal.pop() i = i + 1 else: a = num.pop() b = num.pop() num.append(eval("{} {} {}".format(b, signal[-1], a))) signal.pop() return num[-1]
class Solution { public: int cct(stack<int> &number, stack<char> &operation) { int tmp_1 = number.top(); number.pop(); int tmp_2 = number.top(); number.pop(); char tmp_o = operation.top(); operation.pop(); if (tmp_o == '+') return tmp_2 + tmp_1; else if (tmp_o == '-') return tmp_2 - tmp_1; else return tmp_1 * tmp_2; } int solve(string s) { stack<int> nmb; stack<char> opt; for (int i = 0; i < s.size(); i++) { for (int j = 0, i_ofs = 0;; i_ofs++) if (s[i + i_ofs] > 47) // 该字符是数字。 j = j * 10 + s[i + i_ofs] - 48; else // 该字符是运算符。 { if (i_ofs) nmb.push(j); i += i_ofs; break; } if (i >= s.size()) break; while (s[i] % 2 && !opt.empty() && opt.top() != '(') // s[i] == ')', '+', '-'; nmb.push(cct(nmb, opt)); s[i] == ')' ? opt.pop() : opt.push(s[i]); } while (!opt.empty()) nmb.push(cct(nmb, opt)); return nmb.top(); } };
class Solution: def solve(self , s: str) -> int: return eval(s)
class Solution: def solve(self , s ): # write code here self.op_priority = {'+': 0, '-': 0, '*': 1} suffix_expression = self.infix2suffix(s) return self.suffix2result(suffix_expression) def suffix2result(self, suffix_expression): stack = [] for op in suffix_expression: if op not in ['+', '-', '*']: stack.append(int(op)) else: num1 = stack.pop() num2 = stack.pop() if op == '+': temp = num2 + num1 elif op == '-': temp = num2 - num1 else: temp = num2 * num1 stack.append(temp) return stack.pop() def infix2suffix(self, s): sop, L, i = [], [], 0 while i < len(s): if self.isNum(s[i]): num = '' while i < len(s) and self.isNum(s[i]): num += s[i] i += 1 L.append(num) elif s[i] == '(': sop.append(s[i]) i += 1 elif s[i] == ')': while sop[-1] != '(': L.append(sop.pop()) sop.pop() i += 1 else: while True: if sop == []&nbs***bsp;sop[-1] == '('&nbs***bsp;(self.op_priority[s[i]] > self.op_priority[sop[-1]]): sop.append(s[i]) break else: L.append(sop.pop()) i += 1 while sop: L.append(sop.pop()) return L def isNum(self, ch): if ch in ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']: return True else: return False