Leetcode 224 Basic Calculator 基本计算器

2024-01-13 11:48

本文主要是介绍Leetcode 224 Basic Calculator 基本计算器,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

原题地址

https://leetcode.com/problems/basic-calculator/

题目描述

Implement a basic calculator to evaluate a simple expression string.
实现基本的计算器,计算简单表达式的值。

The expression string may contain open ( and closing parentheses ), the plus + or minus sign -, non-negative integers and empty spaces .
表达式中可能会出现括号( ),加号+减号-,非负数以及空格。

You may assume that the given expression is always valid.
假设表达式都是正确的。

Some examples:
例如:

"1 + 1" = 2
" 2-1 + 2 " = 3
"(1+(4+5+2)-3)+(6+8)" = 23

解题思路

由于表达式中只有+ -两种运算符,因此不用考虑优先级的问题,唯一需要处理的是括号带来的计算顺序问题。考虑遍历整个字符串,当遇到( + -合法数字时,将相应字符或数字压栈,当遇到)时,从栈中弹出运算符及数字直到与这个括号匹配的开括号为止,并计算弹出的运算符和数字的结果,计算结束后压栈,然后继续遍历表达式。

在上述过程结束后,栈中还留有一些运算符合数字,但是不再包含括号,这时弹出所有运算符和数字进行一次运算即可得到最终结果。

代码

class Solution {
public:/** 简单表达式计算 */int calculate(string s) { stack<string> expr, nums, ops;int cur = 0, len = s.size();string tmp = "";while (cur < len) {// 获取下一个操作数或操作符switch (s[cur]) {case ' ': break;    // 忽略空格case '+':           // 如果遇到特殊字符case '-': case '(': if (tmp != "") {// 添加可能存在的操作数expr.push(tmp);tmp = "";}expr.push(tmp + s[cur]); // 添加特殊字符break;case ')': {         // 遇到闭合括号if (tmp != "") {// 添加可能存在的操作数expr.push(tmp);tmp = "";}               // 计算最顶层的括号内的子表达式int caled = calculate(expr);expr.push(intToStr(caled)); // 添加到栈中break;}default:    // 扩展操作数tmp += s[cur];break;}++cur;}if (tmp != "") expr.push(tmp);return calculate(expr); // 计算}
private:/** 计算栈中最上层的括号内的表达式 */int calculate(stack<string>& s) {stack<int> nums; stack<char> ops;string top;// 获取最顶层括号内的操作数和操作符while (!s.empty() && (top = s.top()) != "(") {if (top == "+" || top == "-")ops.push(top[0]);elsenums.push(strToInt(top));s.pop();}if (!s.empty()) s.pop(); // 弹出"("// 计算子表达式结果int ans = nums.top(), num;nums.pop();while (!ops.empty()) {num = nums.top();nums.pop();if (ops.top() == '+')ans += num;elseans -= num;ops.pop();}return ans;}int strToInt(string s) {int ans = 0, len = s.size();if (len == 0) return 0;int symbol = s[0] == '-' ? -1 : 1;for (int i = s[0] == '+' || s[0] == '-' ? 1 : 0; i < len; ++i) {ans *= 10;ans += s[i] - '0';}return ans * symbol;}string intToStr(int num) {if (num == 0) return "0";int symbol = num >= 0 ? 1 : -1;string s = "";num *= symbol;while (num) {s = (char)(num % 10 + '0') + s;num /= 10;}if (symbol == -1)s = "-" + s;return s;}
};

完整代码 https://github.com/Orange1991/leetcode/blob/master/224/cpp/main.cpp

测试数据

(1+(4+5+2 ) - 3) + (6+8)=23
1 + 1=22-1 + 2 =32-(5-6) =3

2015/8/28

这篇关于Leetcode 224 Basic Calculator 基本计算器的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/601352

相关文章

哈希leetcode-1

目录 1前言 2.例题  2.1两数之和 2.2判断是否互为字符重排 2.3存在重复元素1 2.4存在重复元素2 2.5字母异位词分组 1前言 哈希表主要是适合于快速查找某个元素(O(1)) 当我们要频繁的查找某个元素,第一哈希表O(1),第二,二分O(log n) 一般可以分为语言自带的容器哈希和用数组模拟的简易哈希。 最简单的比如数组模拟字符存储,只要开26个c

基本知识点

1、c++的输入加上ios::sync_with_stdio(false);  等价于 c的输入,读取速度会加快(但是在字符串的题里面和容易出现问题) 2、lower_bound()和upper_bound() iterator lower_bound( const key_type &key ): 返回一个迭代器,指向键值>= key的第一个元素。 iterator upper_bou

【IPV6从入门到起飞】5-1 IPV6+Home Assistant(搭建基本环境)

【IPV6从入门到起飞】5-1 IPV6+Home Assistant #搭建基本环境 1 背景2 docker下载 hass3 创建容器4 浏览器访问 hass5 手机APP远程访问hass6 更多玩法 1 背景 既然电脑可以IPV6入站,手机流量可以访问IPV6网络的服务,为什么不在电脑搭建Home Assistant(hass),来控制你的设备呢?@智能家居 @万物互联

leetcode-24Swap Nodes in Pairs

带头结点。 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode(int x) { val = x; }* }*/public class Solution {public ListNode swapPairs(L

leetcode-23Merge k Sorted Lists

带头结点。 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode(int x) { val = x; }* }*/public class Solution {public ListNode mergeKLists

C++ | Leetcode C++题解之第393题UTF-8编码验证

题目: 题解: class Solution {public:static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num &

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟)

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟) 题目描述 给定一个链表,链表中的每个节点代表一个整数。链表中的整数由 0 分隔开,表示不同的区间。链表的开始和结束节点的值都为 0。任务是将每两个相邻的 0 之间的所有节点合并成一个节点,新节点的值为原区间内所有节点值的和。合并后,需要移除所有的 0,并返回修改后的链表头节点。 思路分析 初始化:创建一个虚拟头节点

C语言 | Leetcode C语言题解之第393题UTF-8编码验证

题目: 题解: static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num & MASK1) == 0) {return

C 语言的基本数据类型

C 语言的基本数据类型 注:本文面向 C 语言初学者,如果你是熟手,那就不用看了。 有人问我,char、short、int、long、float、double 等这些关键字到底是什么意思,如果说他们是数据类型的话,那么为啥有这么多数据类型呢? 如果写了一句: int a; 那么执行的时候在内存中会有什么变化呢? 橡皮泥大家都玩过吧,一般你买橡皮泥的时候,店家会赠送一些模板。 上

FreeRTOS-基本介绍和移植STM32

FreeRTOS-基本介绍和STM32移植 一、裸机开发和操作系统开发介绍二、任务调度和任务状态介绍2.1 任务调度2.1.1 抢占式调度2.1.2 时间片调度 2.2 任务状态 三、FreeRTOS源码和移植STM323.1 FreeRTOS源码3.2 FreeRTOS移植STM323.2.1 代码移植3.2.2 时钟中断配置 一、裸机开发和操作系统开发介绍 裸机:前后台系