四则运算

四则运算

http://www.nowcoder.com/questionTerminal/9999764a61484d819056f807d2a91f1e

问题:如何判断'+'或'-'是加减还是正负?
解答:用一个变量来判断:数字和运算符是交替出现的(括号的出现不会影响这种交替关系)。

思路

  1. 用两个栈分别压数字和运算符;
  2. 如果当前运算符优先级('*/')高于栈顶运算符('+-')优先级,则将运算符入栈;反之,从数字栈中弹出两个数,从运算符栈中弹出栈顶运算符,进行运算,数字栈压入运算结果,符号栈压入当前运算符。重复该操作直到不满足条件。
  3. 出现左括号,则直接压入;出现右括号,则从数字栈中弹出两个数,从运算符栈中弹出栈顶运算符,进行运算,数字栈压入运算结果,重复该操作直到栈顶弹出右括号位置。

题解

#include <iostream>
#include <stack>
using namespace std;

string mp = "+-*/)]}";
// 当前运算符与符号栈的栈顶运算符做优先级比较,如果当前优先级高,则不做运算压入栈中,相同进行运算
bool cmp(char c1, char c2)
{
    if (c1 =='(') {
        return false;
    } else if((c1=='+' || c1=='-') && (c2=='*' || c2=='/')){
        return false;
    }
    return true;
}

void doCal(stack<double> &st, stack<char> &so)
{
    double b = st.top();
    st.pop();
    double a = st.top();
    st.pop();
    int op = so.top();
    so.pop();
    if(op == '+') a = a+b;
    else if(op == '-') a = a-b;
    else if(op == '*') a = a*b;
    else if(op == '/') a = a/b;
    st.push(a);
    return ;
}

int main()
{
    string s;
    while(getline(cin, s))
    {
        stack<double> st;
        stack<char> so;
        so.push('(');
        s += ')';
        bool nextIsOp = false;
        for(int i = 0; i < s.size(); i++)
        {
            if(s[i]=='{' || s[i]=='[' || s[i]=='(') {
                so.push('(');
            } else if(s[i]==')' || s[i]==']' || s[i]=='}') {
                while(so.top() != '(') doCal(st, so);
                so.pop();
            } else if (nextIsOp) {
                while(cmp(so.top(), s[i])) doCal(st, so);
                so.push(s[i]);
                nextIsOp = false;
            } else {
                int j = i;
                if(s[j] == '-' || s[j] == '+') i++;
                while(mp.find(s[i]) == mp.npos) i++;
                string t = s.substr(j, i-j);
                st.push((double)stoi(t));
                i--;
                nextIsOp = true;
            }
        }
        cout << st.top() << endl;
    }
    return 0;
}

https://github.com/ultraji/nowcoder

全部评论
另外:你这个处理不了正号/负号后面跟括号的情况。
2 回复 分享
发布于 2021-07-27 08:46
你管这叫简单题呜呜呜呜呜
点赞 回复 分享
发布于 2022-05-20 20:42
你管这叫简单题呜呜呜呜呜
点赞 回复 分享
发布于 2022-01-23 11:04
秒啊!
点赞 回复 分享
发布于 2021-08-17 15:21
while(mp.find(s[i]) == mp.npos) 这个是不必要的,只需要判断s[i]是否是数字即可。
点赞 回复 分享
发布于 2021-07-27 08:04
-(1+2) 出错,最后的那个 else{...} 有点问题
点赞 回复 分享
发布于 2021-01-12 20:21

相关推荐

03-20 17:35
武汉大学 Java
薛悦悦:强烈推荐!这个笔记写得很清晰 http://github.com/AccumulateMore/CV
点赞 评论 收藏
分享
点赞 评论 收藏
分享
评论
85
9
分享

创作者周榜

更多
正在热议
更多
# 春招至今,你的战绩如何? #
8136次浏览 75人参与
# 你的实习产出是真实的还是包装的? #
1493次浏览 37人参与
# 巨人网络春招 #
11265次浏览 223人参与
# 军工所铁饭碗 vs 互联网高薪资,你会选谁 #
7266次浏览 40人参与
# 简历第一个项目做什么 #
31433次浏览 319人参与
# 当下环境,你会继续卷互联网,还是看其他行业机会 #
186697次浏览 1118人参与
# MiniMax求职进展汇总 #
23528次浏览 305人参与
# 不考虑薪资和职业,你最想做什么工作呢? #
152171次浏览 887人参与
# 研究所笔面经互助 #
118827次浏览 577人参与
# 重来一次,我还会选择这个专业吗 #
433206次浏览 3924人参与
# 简历中的项目经历要怎么写? #
309816次浏览 4176人参与
# 面试紧张时你会有什么表现? #
30452次浏览 188人参与
# 你今年的平均薪资是多少? #
212883次浏览 1039人参与
# AI时代,哪些岗位最容易被淘汰 #
63109次浏览 773人参与
# 我的求职精神状态 #
447904次浏览 3128人参与
# 你最满意的offer薪资是哪家公司? #
76323次浏览 374人参与
# 正在春招的你,也参与了去年秋招吗? #
362991次浏览 2635人参与
# 你怎么看待AI面试 #
179654次浏览 1206人参与
# 牛客AI文生图 #
21374次浏览 237人参与
# 职能管理面试记录 #
10766次浏览 59人参与
# 网易游戏笔试 #
6420次浏览 83人参与
# 腾讯音乐求职进展汇总 #
160518次浏览 1108人参与
牛客网
牛客网在线编程
牛客网题解
牛客企业服务