首页 > 编程语言 >计算器算法

计算器算法

时间:2024-01-09 14:55:06浏览次数:38  
标签:优先级 ops int nums pos 算法 计算器

目录
先把力扣上5道计算器的题目干了,主要使用双栈法

思路

用一个栈ops存操作,用一个栈nums存数字
然后从前往后做,对遍历到的字符做分情况讨论:

  • 空格 : 跳过
  • ( : 直接加入 ops 中,等待与之匹配的 )
  • ) : 使用现有的 nums 和 ops 进行计算,直到遇到左边最近的一个左括号为止,计算结果放到 nums
  • 数字 : 从当前位置开始继续往后取,将整一个连续数字整体取出,加入 nums
  • +/- : 需要将操作放入 ops 中。在放入之前先把栈内可以算的都算掉,使用现有的 nums 和 ops 进行计算,直到没有操作或者遇到左括号,计算结果放到 nums

最简单的计算器(好像也不简单,因为有*/)

https://leetcode.cn/problems/calculator-lcci/description/

224

772 困难计算器 可以通解224 227 和上面的题

在上述的要求中,出现了四则运算的比较,如何比较四则运算的优先顺序呢,简单来说,我们用一个map来映射运算符的优先级:
如:
unordered_map<char, int> level = {{'-', 1}, {'+', 1}, {'*', 2}, {'/', 2}};
当运行到有加减乘除的区域,就计算优先级了

  • 当读取到:5+5*2
    读取到*时,*的优先级为2,大于+的1优先级,那么这里就选择直接入栈,等到其他的情况再进行运算
  • 当读取到: 5+5*2/或是5+5*2)
    这里就发现/的优先级等于*的优先级,可以直接把*运算了,再读取+的时候发现又小于/的优先级,再次停止运算
class Solution {
public:
    unordered_map<char,int> level={
        {'-', 1},
        {'+', 1},
        {'*', 2},
        {'/', 2}
    };

    int calculate(string s) {
         // 存放所有的数字
        stack<int> nums;
        // 为了防止第一个数为负数,先往 nums 加个 0
        nums.push(0);
        // 将所有的空格去掉
        removeSpace(s);
        //去掉所有形如(- (+的玩意
        removeSpecial(s);
        // 存放所有的操作,包括 +/-
        stack<char> ops;
        int n = s.size();
        for(int i = 0; i < n; i++) {
            char c = s[i];
            if(c == '(')
                ops.push(c);
            else if(c == ')') {
                // 计算到最近一个左括号为止
                while(!ops.empty()) {
                    char op = ops.top();
                    if(op != '(')
                        calc(nums, ops);
                    else {
                        ops.pop();
                        break;
                    }
                }
            }
            else {
                if(isdigit(c)) {
                    int cur_num = 0;
                    int j = i;
                    // 将从 i 位置开始后面的连续数字整体取出,加入 nums
                    while(j <n && isdigit(s[j]))
                    {
                        cur_num = cur_num*10 + (s[j] - '0');
                        j++;
                    }
                    // 注意上面的计算一定要有括号,否则有可能会溢出
                    nums.push(cur_num);
                    i = j-1;
                }
                else {
                    // 有一个新操作要入栈时,先把栈内可以算的都算了
                    //并且比较其中运算符的优先级,如果新读取到的运算符优先级没有栈内的高/等于栈内运算符优先级,那么可以直接进行运算
                    while(!ops.empty() && ops.top() != '('&&level[ops.top()]>=level[c])
                        calc(nums, ops);
                    ops.push(c);
                }
            }
        }
        while(!ops.empty())
            calc(nums, ops);
        return nums.top();

    }
    void removeSpace(string & s)
    {
        int pos=s.find(' ');
        while(pos!=-1)
        {
            s.erase(pos,1);
            pos=s.find(' ');
        }
    }
    void removeSpecial(string & s)
    {
        int pos=s.find('(');
        while(pos!=-1&&pos+1<s.length())
        {
            if(s[pos+1]=='+')
            {
                s.replace(pos,2,"(0+");
            }
            else if(s[pos+1]=='-')
            {
                s.replace(pos,2,"(0-");
            }
            pos=s.find('(',pos+1);
        }
    }
    void calc(stack<int>& nums,stack<char>& ops)
    {
        if(nums.size()<2||ops.empty())
        {
            return;
        }
        int b=nums.top();nums.pop();
        int a=nums.top();nums.pop();
        char op=ops.top();ops.pop();
        switch(op)
        {
            case '+':
                nums.push(a+b);
                break;
            case '-':
                nums.push(a-b);
                break;
            case '*':
                nums.push(a*b);
                break;
            case '/':
                nums.push(a/b);
                break;
            default:
                break;
        }
        
    }
};

标签:优先级,ops,int,nums,pos,算法,计算器
From: https://www.cnblogs.com/liviayu/p/17954487

相关文章

  • 一分钟带你了解深度学习算法
    深度学习是一种受到生物学启发的机器学习方法,其目标是通过构建多层神经网络来模拟人脑的工作原理。它在过去几十年来取得了巨大的进展,并在图像识别、语音识别、自然语言处理等领域取得了突破性的成果。深度学习的核心思想是模仿人脑的神经网络。人脑中的神经元通过连接起来形成庞大......
  • 【动态规划】【字符串】C++算法:正则表达式匹配
    作者推荐视频算法专题涉及知识点动态规划字符串LeetCode10:正则表达式匹配给你一个字符串s和一个字符规律p,请你来实现一个支持‘.’和‘’的正则表达式匹配。‘.’匹配任意单个字符'’匹配零个或多个前面的那一个元素所谓匹配,是要涵盖整个字符串s的,而不是部分字符......
  • TecoGAN视频超分辨率算法
    1.摘要对抗训练在单图像超分辨率任务中非常成功,因为它可以获得逼真、高度细致的输出结果。因此,当前最优的视频超分辨率方法仍然支持较简单的范数(如L2)作为对抗损失函数。直接向量范数作损失函数求平均的本质可以轻松带来时间流畅度和连贯度,但生成图像缺乏空间细节。该研究提出了一......
  • 【C++】STL 算法 ② ( foreach 循环中传入 函数对象 / Lambda 表达式处理元素 | forea
    文章目录一、foreach循环中传入函数对象/Lambda表达式处理元素1、foreach循环算法2、foreach循环中传入函数对象处理元素3、foreach循环中传入Lambda表达式处理元素4、Lambda表达式-匿名函数对象/仿函数一、foreach循环中传入函数对象/Lambda表达式处理......
  • 估计量评价与分类算法的对比
    1.背景介绍随着数据量的增加,人工智能和机器学习技术在各个领域的应用也不断扩大。估计量和分类算法是这些领域中最常见的技术之一。在这篇文章中,我们将讨论这两种算法的基本概念、原理、应用和优缺点,以及它们之间的区别和联系。估计量(Estimation)和分类(Classification)算法都是用于解......
  • 深度学习的算法:从自动编码器到生成对抗网络
    1.背景介绍深度学习是一种人工智能技术,它旨在模拟人类大脑中的神经网络,以解决复杂的问题。深度学习的算法通常包括自动编码器、生成对抗网络和其他算法。这篇文章将详细介绍这两种算法的原理、数学模型和实例代码。1.1深度学习的历史和发展深度学习的历史可以追溯到1940年代的人工......
  • 神经进化算法在社交网络领域的优化与创新
    1.背景介绍社交网络已经成为了现代人们生活中不可或缺的一部分,它们为我们提供了一种快捷、高效的沟通和交流方式。然而,随着社交网络的不断发展和扩张,它们也面临着各种挑战,如信息过载、网络滥用、虚假账户等。因此,在社交网络领域,优化和创新变得至关重要。神经进化算法(NEA)是一种基于......
  • 什么是降维算法
    在机器学习中,随着数据特征的增加,需要更大的计算资源来训练模型。这可能导致模型的训练时间和内存消耗增加,甚至可能导致模型无法训练或训练结果不准确。为此,降维算法成为机器学习领域中的一种重要技术,它可以将高维空间中的数据点映射到低维空间中。降维算法可以帮助我们发现数据中的......
  • 【教3妹学编程-算法题】对角线最长的矩形的面积
    3妹:好冷啊,冻得瑟瑟发抖啦2哥 :这才哪跟哪,上海这几天温度算是高的啦。你看看哈尔滨,那才是冰城。3妹:据说沈阳千名“搓澡大姨”支援哈尔滨?哈哈哈哈2哥 :就像今年的淄博烧烤,可能有炒作的成分3妹:不不,是去年的了,今年已经24年啦。2哥,你说哈尔滨的面积是多少,这么多人涌入哈尔滨,能住的......
  • 文心一言 VS 讯飞星火 VS chatgpt (174)-- 算法导论13.3 3题
    三、用go语言,假设图13-5和图13-6中子α、β、γ、δ和ε的黑高都是k。给每张图中的每个结点标上黑高,以验证图中所示的转换能保持性质5。文心一言:在Go语言中,你可以通过以下步骤来为图13-5和图13-6中的每个节点分配黑高,以验证性质5。首先,我们需要定义一个结构体来表示图中的节点,然......