首页 > 其他分享 >leetcode 224 基本计算器

leetcode 224 基本计算器

时间:2024-07-21 12:18:39浏览次数:11  
标签:int operators 减号 numbers && 计算器 push 224 leetcode

题面就是实现一个字符串输入的加减法计算器(带括号),注意一元的减号是会出现的,且字符串中有空格
思路就是使用两个栈,一个储存数字和计算结果,另外一个存运算符。
基本步骤

  • 删去括号
  • 如果遇到')'就开始计算直到前一个左括号,运算顺序是先出栈的放在后面

遇到的坑

  • 减号的优先级是高的,所以遇到减号要直接计算
  • 在将字串转化成数字时要先算s[i]-'0',否则可能会超出int范围
  • 最简单的处理方法就是在每个新操作前把能算的都算完

tips
为了处理方便,可以在一元'+' 和'-'前面push(0)

具体代码

class Solution {
public:
void cal(stack<int>& numbers, stack<char>& operators){
    if(numbers.size()<2||operators.empty()) return;
    int num1, num2;
    char op;
        op=operators.top();
        operators.pop();
        num2=numbers.top();
        numbers.pop();
        num1=numbers.top();
        numbers.pop();
        if(op=='+'){numbers.push(num1+num2);}
        else if(op=='-'){numbers.push(num1-num2);}
        
}

void replace_space(string& s){
    int pos=s.find(" ");
    while(pos!=-1){
        s.replace(pos,1,"");
        pos=s.find(" ");
        }
}

    int calculate(string s) {
        stack<int> numbers;
        stack<char> operators;
        if(s[0]=='-'||s[0]=='+') numbers.push(0);
        int num = 0;
        replace_space(s);
        for (int i = 0; i < s.length();i++) {
            if (s[i] >= '0' && s[i] <= '9') {
                int number=0;
                int j=i;
                while(j<s.length()&&s[j]>='0'&&s[j]<='9'){
                    number=number*10+s[j]-'0';
                    j++;
                }
                numbers.push(number);
                i=j-1;
            }
            
            else if(s[i]==')'){
                while(!operators.empty()){
                    char op=operators.top();
                    if(op!='(')
                    cal(numbers,operators);
                    else{
                        operators.pop();
                        break;
                    }
                }
            }
            else if(s[i]=='(') operators.push(s[i]);
            else{
                if(i>0&&(s[i-1]=='('||s[i-1]=='+'||s[i-1]=='-'))  numbers.push(0);
                while (!operators.empty()&&operators.top()!='(')
                {
                    cal(numbers,operators);
                }
                operators.push(s[i]);
            }
    }
    while(!operators.empty()){
        cal(numbers,operators);
    }
    return numbers.top();
    }
};

标签:int,operators,减号,numbers,&&,计算器,push,224,leetcode
From: https://www.cnblogs.com/oxidationreaction/p/18314335

相关文章

  • Leetcode 中的动态规划
    对于初学者来说,Leetcode中的动态规划可以做哪些问题?我想知道可以使用Leetcode中的动态规划来解决哪些问题,对于初学者来说很容易。我一直在LeetCode上练习问题,我注意到有些问题被专门标记为“动态编程”(DP)。我了解DP的基础知识,例如将问题分解为子问题并存储这些子问题的......
  • JAVA实现简单的计算器(整数)
    计算器实现基本流程实现加减乘除四个独立的方法。编写输入数据的语句(Scanner方法)。用switch来选择一个计算方式。添加输入选择计算方式的语句。importjava.util.Scanner;publicclassdemo03_calc{publicstaticvoidmain(String[]args){System.out.p......
  • [LeetCode] 977. 有序数组的平方
    有序数组的平方简单给你一个按非递减顺序排序的整数数组nums,返回每个数字的平方组成的新数组,要求也按非递减顺序排序。示例1:输入:nums=[-4,-1,0,3,10]输出:[0,1,9,16,100]解释:平方后,数组变为[16,1,0,9,100]排序后,数组变为[0,1,9,16,100]示例2:输入:nums=[-7......
  • leetcode位运算(3211. 生成不含相邻零的二进制字符串)
    前言经过前期的基础训练以及部分实战练习,粗略掌握了各种题型的解题思路。接下来重点专项练习,加强重难点知识的练习。描述给你一个正整数 n。如果一个二进制字符串 x 的所有长度为2的子字符串中包含 至少 一个 "1",则称 x 是一个 有效 字符串。返回所有长度......
  • LeetCode 1788. 最大化花园的美观度
    1788.最大化花园的美观度有一个花园,有 n 朵花,这些花都有一个用整数表示的美观度。这些花被种在一条线上。给定一个长度为 n 的整数类型数组 flowers ,每一个 flowers[i] 表示第 i 朵花的美观度。一个花园满足下列条件时,该花园是有效的。花园中至少包含两朵花。第......
  • LeetCode题练习与总结:比较版本号--165
    一、题目描述给你两个 版本号字符串 version1 和 version2 ,请你比较它们。版本号由被点 '.' 分开的修订号组成。修订号的值 是它 转换为整数 并忽略前导零。比较版本号时,请按 从左到右的顺序 依次比较它们的修订号。如果其中一个版本字符串的修订号较少,则将缺失......
  • 算法第十一天:leetcode707.设计链表
    一、设计链表的题目描述与链接  707.设计链表的链接如下表所示,您可直接复制下面网址进入力扣学习,在观看下面的内容之前一定要先做一遍哦,这样才能印象深刻!https://leetcode.cn/problems/design-linked-list/https://leetcode.cn/problems/design-linked-list/题目描述:你......
  • 使用 PyQt5 创建 计算器程序
    在这篇博客中,我们将使用Python的PyQt5库来创建一个简单的计算器应用。我们的计算器将有基本的加、减、乘、除功能。1.导入所需的模块首先,我们需要导入我们将在代码中使用的所有模块:fromPyQt5.QtWidgetsimportQApplication,QMainWindow,QPushButton,QVBoxLayout,QW......
  • (nice!!!)LeetCode 3085. 成为 K 特殊字符串需要删除的最少字符数(贪心、哈希表、字符串)
    3085.成为K特殊字符串需要删除的最少字符数思路:1、用哈希表mp先统计出字符串word中所有字母出现的次数2、将哈希表里的次数进行升序排序v3、采用贪心的策略,删除最少的字符串,就是保留最大的字符串。可知,最少有一个元素的数量不需要改变。那么我们就枚举这个数量v[i],......
  • 【代码随想录训练营第42期 Day3打卡 LeetCode 203.移除链表元素,707.设计链表,206.反转
    一、做题感受今天是打卡的第三天,前两天题目主要考察数组相关知识,现在已经来到了链表的学习。题目共有三道,都是以考察单链表为主,整体来说难度不大,但是思路很灵活,尤其是反转链表的考察,双指针的新用法。今天做题总体感觉不错,能有自己的思考和理解。二、链表相关知识1.常见链表......