垃圾学渣求毕业 2021-11-28 09:08 采纳率: 50%
浏览 53
已结题

C++/C 关于栈的小问题

输入的格式有以下几种的数学表达式:
expr := integer;
expr := (expr)+(expr);
expr := (expr)-(expr);

要求输入的时候没有任何的空格,可以读取 "(" ")" “+”和“-”
输入和输出的数字皆为int值。字符串总长度不超过10^6个字符

输出: 输出表达式的结果,为int值
例如:
(7)-((1)+(2)) ——>输出 4
((5)+(9))-((4)-(1)) ——> 输出11
(((((995)+(166))+((-142)+(12)))-((969)+(276)))-(354))-((((-255)+((((((-170)+(-646))+(-570))-((-797)+(913)))+(((((((((852)+(858))-(179))-(-392))+((-955)-(-151)))+(-548))+(128))-(91))+(((-998)+(-119))-(((163)-(656))+(196)))))-(((767)-((454)+((-615)-((-783)+((614)-(390))))))+((((-322)-(((-249)+(691))+(707)))-((-658)-((((-238)+((912)-(893)))-(((33)+(((-853)+(488))+(-630)))+((((134)-(299))-(-601))+(-255))))-((-746)-(((1)+(-913))+(-101))))))+(((((-141)-((802)-(-891)))+(-979))+(((16)-(579))-(94)))+(337))))))-(((((313)+((696)-(2)))+(483))+(((988)+((133)+(-76)))-(662)))-(((((-288)+((792)-(-813)))-(996))+(-249))+((((((-677)-(809))-((((-753)+((-580)-((-448)-(815))))+((((-136)-((575)+(-204)))-(889))-(-645)))+((-112)-(-280))))+((((-29)+((258)-(37)))+((-419)-(650)))-(((((-370)-(-276))+(-957))-(618))-((-506)-((((-624)-(-978))+(-168))+(627))))))+(((((866)+((-200)-(-404)))+(-472))-(-641))-(-4)))-(((((707)+(588))+((-594)-(266)))-(((-469)-(754))-(497)))-((((-522)-(-672))-((((-588)+(-450))-(871))-((12)+(281))))-(369)))))))+(-650))
——>输出859

  • 写回答

1条回答 默认 最新

  • 南七灵 2021-11-28 10:53
    关注
    
    #include <iostream>
    #include <stack>
    using namespace std;
    int calculate(string s);
    int main(){
        string s;
        cin >> s;
        int res = calculate(s);
        cout << res << endl;
    
    }
    int calculate(string s) {
            stack<int> ops;
            ops.push(1);
            int sign = 1;
    
            int ret = 0;
            int n = s.length();
            int i = 0;
            while (i < n) {
                if (s[i] == ' ') {
                    i++;
                } else if (s[i] == '+') {
                    sign = ops.top();
                    i++;
                } else if (s[i] == '-') {
                    sign = -ops.top();
                    i++;
                } else if (s[i] == '(') {
                    ops.push(sign);
                    i++;
                } else if (s[i] == ')') {
                    ops.pop();
                    i++;
                } else {
                    long num = 0;
                    while (i < n && s[i] >= '0' && s[i] <= '9') {
                        num = num * 10 + s[i] - '0';
                        i++;
                    }
                    ret += sign * num;
                }
            }
            return ret;
        }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 12月6日
  • 已采纳回答 11月28日
  • 创建了问题 11月28日

悬赏问题

  • ¥15 微信小程序协议怎么写
  • ¥15 c语言怎么用printf(“\b \b”)与getch()实现黑框里写入与删除?
  • ¥20 怎么用dlib库的算法识别小麦病虫害
  • ¥15 华为ensp模拟器中S5700交换机在配置过程中老是反复重启
  • ¥15 java写代码遇到问题,求帮助
  • ¥15 uniapp uview http 如何实现统一的请求异常信息提示?
  • ¥15 有了解d3和topogram.js库的吗?有偿请教
  • ¥100 任意维数的K均值聚类
  • ¥15 stamps做sbas-insar,时序沉降图怎么画
  • ¥15 买了个传感器,根据商家发的代码和步骤使用但是代码报错了不会改,有没有人可以看看