基本计算器(有括号的加减运算)DHU

目录

题目描述 

分析与思考

 代码

 参考网站


 

题目描述 

时间限制: 1S类别: DS:栈->栈的应用

问题描述 :

给你一个字符串表达式 s ,请你实现一个基本计算器来计算并返回它的值。

注意:不允许使用任何将字符串作为数学表达式计算的内置函数,比如 eval() 。

示例 1:

输入:s = "1 + 1"

输出:2

示例 2:

输入:s = " 2-1 + 2 "

输出:3

示例 3:

输入:s = "(1+(4+5+2)-3)+(6+8)"

输出:23

说明:

1 <= s.length <= 3 * 10^5

s 由数字、'+'、'-'、'('、')'、和 ' ' 组成

s 表示一个有效的表达式

'+' 不能用作一元运算(例如, "+1" 和 "+(2 + 3)" 无效)

'-' 可以用作一元运算(即 "-1" 和 "-(2 + 3)" 是有效的)

输入中不存在两个连续的操作符

每个数字和计算的结果将不超过有符号的32位整数(即int型整数)的表示范围

输入说明 :

输入一行字符串s,s 由数字、'+'、'-'、'('、')'、和 ' ' 组成,s为一个有效表达式

输出说明 :

输出一行,表示结果

输入范例 :(1+(4+5+2)-3)+(6+8)

输出范例 :23

分析与思考

/*
 * 问题一
 * 多位数数字的记录通过数字与非数字符号之间的分开处理实现
 * 通过for循环遍历,同时只有一个if else语句一个针对于数字一个针对于非数字,这样如果数字连续可以实现前字符串雨后字符串的关联
 * 同理,这样也可以实现前符号与后符号的关联比如‘+’或‘-’与‘(’或‘)’的关联,如果前+后(那么就要push一个新基础符号用1代表+
 * 但这里的符号没用这种方法,用了更简单的
 * 问题二
 *  * 空格问题,不仅仅是2+ 5变成2+5还要2+ 2 5变成2+25
 * 这就意味着把空格问题的处理代码放到对数字的处理部分中
 * 问题三
 *  *  *这道题难点在于变号
 * 定义一个名词:基础符号
 * 括号括住的每一层,都有一个基本符号,可以是+也可以是-,就是变号是在什么符号的基础上变号,那个符号就叫做这一括号层基础符号
 * 比如说一开始基础符号是+,“-()”的括号里面的式子基础符号是-
 * 它通过栈的层次性,对应了括号的不同层次性,从而实现了不同括号内部不同符号的变号以及不变号的操作
 */

 代码

#include "bits/stdc++.h"
#include "stack"
using namespace std;

class Solution {
public:
    int calculate(string s) {
        stack<int> ops;//储存不同层次括号的基础符号
        ops.push(1);
        int sign=1;//直接操作符号,也叫做去掉一切符号以后这个数字前面的真正符号用sign表示
        int num=0,total=0;
        int len=s.size();
       for(int i=0;i<len;) {
           if(!isdigit(s[i])&&s[i]!=' ') {
               if (s[i] == '+') {
                   sign = ops.top();//如果是+那就直接沿袭这个括号层次中的基础符号,用1代替
               } else if (s[i] == '-') {
                   sign = -ops.top();//如果是-那就直接拿出相反的,用-1代替
               } else if (s[i] == '(') {
                   ops.push(sign);//设置新的一层的基础符号,用括号前的符号设置,也就是之前设置过的sign的值来代表
               } else if (s[i] == ')') {
                   ops.pop();//出栈,讲到下一层次
               }
               num = 0;
               i++;
           }
           else while (isdigit(s[i]) || s[i] == ' ') {
               if (s[i] == ' ')
                   ;
               else
                   num = num * 10 + int(s[i] - '0');
               i++;
           }
           total += (sign * num);
       }
       return total;
    }
};
int main(){
    string string1;
    getline(cin,string1);
    Solution s;
   int sum=s.calculate(string1);
   cout<<sum;
}

 参考网站

leetcode224.基本计算器官方解答

leetcode面试题16.26计算器

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值