[华为机试真题]68.简单四则运算

简介:

题目

输入一个只包含个位数字的简单四则运算表达式字符串,计算该表达式的值
注:
3.1、表达式只含 +, -, *, / 四则运算符,不含括号
3.2、表达式数值只包含个位整数(0-9),且不会出现0作为除数的情况
3.3、要考虑加减乘除按通常四则运算规定的计算优先级
3.4、除法用整数除法,即仅保留除法运算结果的整数部分。比如8/3=2。输入表达式保证无0作为除数情况发生
3.5、输入字符串一定是符合题意合法的表达式,其中只包括数字字符和四则运算符字符,除此之外不含其它任何字符,不会出现计算溢出情况

要求实现函数

int calculate(int len,char *expStr)
【输入】 int len: 字符串长度;char *expStr: 表达式字符串;
【输出】 无
【返回】 计算结果

示例

1)输入:char *expStr = “1+4*5-8/3”
函数返回:19
2)输入:char *expStr = “8/3*3”
函数返回:6

思路

题目要求很简单,只是计算个位数的四则运算,且没有括号。主要考察栈的运用,实现时采用两个辅助栈,一个用来存放操作数,一个用来存放运算符。根据操作符的优先级进行计算。
两个数组分别存储操作数和操作符,扫描输入的字符串,当遇到*和/的时候,边计算边存储,将计算结果存到操作数的数组中,当遇到+和-号时只存储不计算。当所有数据存储完毕后,因为运算就只剩下+-运算了.

代码

/*---------------------------------------
*   日期:2015-07-07
*   作者:SJF0115
*   题目:简单四则运算
*   来源:华为机试真题
-----------------------------------------*/
#include <iostream>
#include <string>
#include <vector>
#include <stack>
#include <algorithm>
using namespace std;

// 简单四则运算
int calculate(string str){
    int size = str.size();
    if(size == 0){
        return 0;
    }//if
    // 数字栈
    stack<int> num;
    // 运算符栈
    stack<char> op;
    for(int i = 0;i < size;++i){
        // 数字
        if(str[i] >= '0' && str[i] <= '9'){
            num.push(str[i] - '0');
        }//if
        // 运算符 加减
        else if(str[i] == '+' || str[i] == '-'){
            op.push(str[i]);
        }//else
        // 运算符 乘除
        else{
            char o = str[i];
            int a = num.top();
            num.pop();
            int b = str[++i] - '0';
            if(o == '*'){
                num.push(a * b);
            }//if
            else if(o == '/'){
                num.push(a / b);
            }//else
        }//else
    }//for
    // 加减操作
    while(!op.empty()){
        char o = op.top();
        op.pop();
        int a = num.top();
        num.pop();
        int b = num.top();
        num.pop();
        if(o == '+'){
            num.push(a + b);
        }//if
        else if(o == '-'){
            num.push(b-a);
        }//else
    }//while
    return num.top();
}

int main(){
    string str;
    //freopen("C:\\Users\\Administrator\\Desktop\\acm.txt","r",stdin);
    while(cin>>str){
        cout<<calculate(str)<<endl;
    }//while
    return 0;
}
目录
相关文章
|
8月前
4.12牛客网刷题总结及位操作符总结
4.12牛客网刷题总结及位操作符总结
108 0
|
Python
牛客刷题之数学基础-约数
牛客刷题之数学基础-约数
62 0
|
安全
华为机试每日一练--第七题: 进制转换
华为机试每日一练--第七题: 进制转换
华为机试每日一练--第七题: 进制转换
|
Serverless 测试技术
华为机试每日一练--第五题: 进制转换
写出一个程序,接受一个十六进制的数,输出该数值的十进制表示。 数据范围:保证结果在 1≤n≤2^31−1
华为机试每日一练--第五题: 进制转换
|
机器学习/深度学习
牛客网练习题(函数部分)
牛客网练习题(函数部分)
100 0
[解题报告](第20讲) 进制转换(二) - 进阶
[解题报告](第20讲) 进制转换(二) - 进阶
[解题报告](第20讲) 进制转换(二) - 进阶
|
存储 机器学习/深度学习 算法
[解题报告](第19讲) 进制转换(一) - 入门(2)
[解题报告](第19讲) 进制转换(一) - 入门
[解题报告](第19讲) 进制转换(一) - 入门(2)
华为机试练习题汇总
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/SunnyYoona/article/details/50458481 华为机试练习广场: [华为机试练习题]1.
2770 0