课后自主练习(递归)1057. 波兰表达式 easy《编程思维与实践》个人学习笔记

题目

逆波兰式是计算机专业常用的表达式,又称后缀表达式。反过来,把运算符前置的算术表达式则称为波兰式,或前缀表达式。

例如普通的表达式的波兰表示法为2+3:+ 2 3。波兰表达式的优点也是运算符之间不必有优先级关系,也不必用括号改变运算次序 .

例如:(2 + 3) * 4的波兰式为:* + 2 3 4,而5-6*7 的波兰表达式为:- 5 * 6 7。

现给定一个波兰表达式,请编写程序计算该表达式的值。

注意:波兰表达式中的运算符包括+ - * / 四个。

数据
3

+ 2 0
- 0.5 3
* + 2 3 4

答案
case #0:
2.000000
case #1:
-2.500000
case #2:
20.000000

思路

既然用到了波兰表达式,我们可以利用deque来实现数据的储存和转换
首先,数据自然是全部都存放进去
然后使用的时候碰到一个运算符号(±×÷)就要开两个栈来预留给两个数字,然后如果继续遇到运算符号继续预留两个数字,直到遇到两个数字,进行运算后返回到上一个栈中,上一个栈对应的另一个子栈再找一个数字来和原先的子栈进行计算即可

说的比较抽象我们就拿图来说
比如+ 5 * - 6 / 4 2 3
在这里插入图片描述

在这里插入图片描述

代码

#include<iostream>
#include<deque>

using namespace std;

double trans(deque<string> & a) {
    string s = a.front();
	a.pop_front();
	switch(s[0]) {
		case '+':
			return trans(a) + trans(a); //递归调用,求出自身包含的波兰式
		case '-':
			return trans(a) - trans(a);
		case '*':
			return trans(a) * trans(a);
		case '/':
			return trans(a) / trans(a);
		default:
			return atof(s.c_str()); //将char转换成对应的浮点数
			break;
	}
}

int main()
{
    int t;
    cin >> t;
    getchar();
    char c = getchar();
    for(int i = 0; i < t; i++)
    {
        deque<string>s;
        string str;
        cout << "case #" << i << ":"<<endl;
        while(c != '\n' && c != EOF)
        {
            if(c == ' ')
            {
                c = getchar();
                s.push_back(str);
                str = "";
                continue;
            }
            str += c;
            c = getchar();
        }

        s.push_back(str);
        str = "";

        // while(!s.empty())
        // {
        //     cout << s.back() << endl;
        //     s.pop_back();
        // }
        printf("%.6lf\n",trans(s));
        c = getchar();
    }

    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值