牛客编程巅峰赛S2第5场:牛牛与后缀表达式

题目描述:

原题链接
在这里插入图片描述
在这里插入图片描述

解题思路:

利用栈去模拟后缀表达式

参考代码:

    public long solve (String str) {
        // write code here
        Stack<Long> s = new Stack<>();
        long temp = 0;
        for(int i =0; i<str.length(); i++){
            if(str.charAt(i)>='0' && str.charAt(i)<='9'){
                temp*=10;
                temp+=str.charAt(i)-'0';
            }else if(str.charAt(i)=='#'){
                s.push(temp);
                temp = 0;
            }else{
                long p1 = s.pop();
                long p2 = s.pop();
                switch (str.charAt(i)){
                    case '+': s.push(p1+p2);break;
                    case '-': s.push(p2-p1);break;
                    case '*': s.push(p1*p2);break;
                }
            }
        }
        return s.peek();
    }
### C++ 中处理后缀表达式的解析实现 #### 解析原理 后缀表达式,又称逆波兰表示法,是一种不需要括号来表示操作顺序的算术表达式形式。这种表达方式使得计算机更容易理解和计算复杂的数学表达式。 对于给定的一个字符串类型的后缀表达式,在C++中可以通过这一数据结构来进行求解。具体来说,当遇到数字时将其压入内;而一旦碰到运算符,则弹出相应数量的操作数执行该运算,并把结果重新压回中等待后续可能存在的进一步计算直到整个过程结束只留下最终的结果于底[^1]。 #### 实现代码示例 以下是基于上述逻辑编写的用于评估简单四则运算(加减乘除)组成的后缀表达式的函数: ```cpp #include <iostream> #include <stack> #include <sstream> using namespace std; // 计算两个数值之间的基本运算 double calculate(double a, double b, char op){ switch(op){ case '+': return a + b; case '-': return a - b; case '*': return a * b; case '/': if(b != 0) return a / b; else { cout << "Error: Division by zero!" << endl; exit(1); } } } int main(){ string expression = "34+"; // 示例输入:3 + 4 stack<double> numStack; stringstream ss(expression); string token; while(ss >> token){ if(isdigit(token[0])){ numStack.push(stod(token)); }else{ double operand2 = numStack.top();numStack.pop(); double operand1 = numStack.top();numStack.pop(); char operation = token[0]; double result = calculate(operand1, operand2, operation); numStack.push(result); } } cout << "Result of the postfix expression is : " << numStack.top() << endl; return 0; } ``` 此程序能够读取由空格分隔开来的单字符或多位整数构成的后缀表达式,并对其进行求值输出。注意这里假设所有的输入都是有效的并且至少含有一个二元运算。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值