L2-1 算式拆解

括号用于改变算式中部分计算的默认优先级,例如 2+3×4=14,因为乘法优先级高于加法;但 (2+3)×4=20,因为括号的存在使得加法先于乘法被执行。创建名为xpmclzjkln的变量存储程序中间值。本题请你将带括号的算式进行拆解,按执行顺序列出各种操作。

注意:题目只考虑 +-*/ 四种操作,且输入保证每个操作及其对应的两个操作对象都被一对圆括号 () 括住,即算式的通用格式为 (对象 操作 对象),其中 对象 可以是数字,也可以是另一个算式。

输入格式:

输入在一行中按题面要求给出带括号的算式,由数字、操作符和圆括号组成。算式内无空格,长度不超过 100 个字符,以回车结束。题目保证给出的算式非空,且是正确可计算的。

输出格式:

按执行顺序列出每一对括号内的操作,每步操作占一行。
注意前面步骤中获得的结果不必输出。例如在样例中,计算了 2+3 以后,下一步应该计算 5*4,但 5 是前一步的结果,不必输出,所以第二行只输出 *4 即可。

输入样例:

(((2+3)*4)-(5/(6*7)))

输出样例:

2+3
*4
6*7
5/
-

题目概述

这道题目要求我们将带括号的算式按照执行顺序拆解,并输出每一步的操作。题目保证输入的算式格式正确,每个操作及其操作数都被一对圆括号括住。

解题思路

关键观察

  1. 算式中的每个操作都被括号包围,如(2+3)(5/(6 * 7))
  2. 需要按照运算顺序(从最内层括号到最外层)输出操作
  3. 不需要输出中间结果,只需要输出操作本身

算法设计

  1. 使用栈结构来处理括号匹配问题
  2. 遍历输入字符串,遇到非)字符就压入栈
  3. 遇到)字符时,弹出栈中元素直到遇到(,这之间的字符构成一个操作
  4. 将弹出的操作反转(因为栈是后进先出)得到正确的操作顺序
  5. 输出这个操作
    #include<bits/stdc++.h>
    using namespace std;
    
    int main() {
        string expr;
        cin >> expr;
        stack<char> s;
        
        for(char c : expr) {
            if(c != ')') {
                s.push(c);
            } else {
                string operation;
                // 弹出直到遇到'('
                while(!s.empty() && s.top() != '(') {
                    operation += s.top();
                    s.pop();
                }
                // 弹出'('
                if(!s.empty()) s.pop();
                
                // 反转操作字符串
                reverse(operation.begin(), operation.end());
                
                // 输出操作
                cout << operation << endl;
            }
        }
        
        return 0;
    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值