Ying

个人博客:http://smartsi.club/

[华为机试真题]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;
}
阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/SunnyYoona/article/details/46785239
文章标签: 华为机试真题
个人分类: 剑指Offer
所属专栏: 华为机试练习题
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭