基本计算器II

本文详细介绍了如何通过栈模拟算法解析算术表达式,包括设置符号、处理加减乘除运算,最终提供了一个Solution类的代码实现,用于计算给定算式的值。
摘要由CSDN通过智能技术生成

题目解析

题目链接
在这里插入图片描述
我们先来看一下题目这个题目的意思很明确就是给你一个算数式让你计算结果并返回并且给了很多辅助条件来帮助你。

算法解析

那么我们来看看这个题目有哪些做法,首先碰到这种算数类的题目我们脑海中首先要有一个大致思路这一类题目基本上都是用栈来模拟的这个题目也不例外可以用栈来模拟。那么我们来看看如何模拟这个题目

算法模拟

首先我们列出一个算式以答案中的例子为例
在这里插入图片描述
首先我们建立一个栈并设置一个字符让这个字符变量初始为‘+’然后再来模拟一下下面的步骤

第一步

首先先设置一个字符将这个字符设置为+号因为我们是要将这些数字通过符号判断正负来放入栈中,我们知道减去一个数字等于加上一个数字的负数因此我们到后面加减操作就可以转化为加法操作了这一点到后面我们就知道了
在这里插入图片描述

第二步

第二步判断此时se的符号并选择后续操作并让箭头向后移动
在这里插入图片描述

第三步

在这里插入图片描述

第四步第五步

在这里插入图片描述

第六步

在这里插入图片描述
此时指针已经指向了最后并且✖号两边的元素都已经放入栈中。

最后一步

最后一步就简单了我门只需要将栈中元素逐个弹出并且相加即可

代码

class Solution {
public:
    int calculate(string n) {
        string s;
        for (auto ne : n) {
            if (ne != ' ') {
                s.push_back(ne);
            }
        }
        char se = '+';
        stack<int>st;
        for (int i = 0; i < s.size(); i++) {
            long long  sum = 0;
            if (s[i] >= '0' && s[i] <= '9') {
                int j = i;
                while (j < s.size() && s[j] >= '0' && s[j] <= '9') {
                    sum = sum * 10 + s[j] - '0';
                    j++;
                }
                if (se == '+') {
                    st.push(sum);
                }
                else if (se == '-') {
                    st.push(-1 * sum);
                }
                i = j-1;
            }
            if (s[i] == '-') {
                se = '-';
            }
            else if (s[i] == '+') {
                se = '+';
            }
            else if (s[i] == '/') {
                int j = i+1;
                while (j < s.size() && s[j] >= '0' && s[j] <= '9') {
                    sum = sum * 10 + s[j] - '0';
                    j++;
                }
                int t = st.top();
                st.pop();
                st.push(t / sum);
                i = j-1;
            }
            else if (s[i] == '*') {
                int j = i + 1;
                while (j < s.size() && s[j] >= '0' && s[j] <= '9') {
                    sum = sum * 10 + s[j] - '0';
                    j++;
                }
                int t = st.top();
                st.pop();
                st.push(sum * t);
                i = j-1;
            }
        }
        int ans = 0;
        while (!st.empty()) {
            ans += st.top();
            st.pop();
        }
        return ans;
    }
};
	和自己的爱人一辈子快乐的在一起吧
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值