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

原创 2015年07月07日 09:46:40

题目

输入一个只包含个位数字的简单四则运算表达式字符串,计算该表达式的值
注:
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;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

[华为机试真题]66.单词搜索

题目代码/*--------------------------------------- * 日期:2015-07-06 * 作者:SJF0115 * 题目:WordSearch * ...

[华为机试真题]72.操作系统任务调度问题

题目操作系统任务调度问题。操作系统任务分为系统任务和用户任务两种。其中, 系统任务的优先级 < 50,用户任务的优先级 >= 50且 ...

[华为机试真题][2014]64.实现两个合法时间相加

题目描述: 给定两个合法的时间(格式固定:hh:mm:ss,时间合法,不用考虑其它情况),输入两个时间相加后的结果;注意,相加后的结果也必需是一个合法的时间; 附合法时间定义:小时在[00-23...

2014华为机试真题(1)

1.及格线问题 10个学生考完期末考试评卷完成后,A老师需要划出及格线,要求如下: (1) 及格线是10的倍数; (2) 保证至少有60%的学生及格; (3) 如果所有的学生都高于60分,则及格线为6...

2014华为机试真题(2)

1.数字是否存在相同部分         求一个整型数字中有没有相同的部分,例如12386123这个整型数字中相同的部分是123,相同的部分至少应该是2位数,如果有相同部分返回1,如果没有则返回0。...

[华为机试真题]69.姓名的夫妻相

题目在中国,形容夫妻恩爱的词汇中,大家用的比较多的就是“夫妻相”。所谓“夫妻相”,就是两个人看上去比较般配,长相、身材等某些方面有一定的相似度。 本题则另辟蹊径,从人的姓名维度,以字母重复个数来寻找最...

[华为机试真题]73.公交站寻址

题目一个N*N二维矩阵代表城市布局,元素值只有’.’,’X’ , ‘B’ , ‘S’,X代表当前位置,B代表路障,S代表公交站,’.’代表可行的路径。 现给定路径长度Y,找到能够到达的公交站的个数,路...

[华为机试真题]70.分苹果

题目M个相同苹果放到N个相同篮子里有多少种放法,允许有篮子不放。1

华为机试在线训练-牛客网(25)四则运算

题目描述 请实现如下接口     /* 功能:四则运算      * 输入:strExpression:字符串格式的算术表达式,如: "3+2*{1+2*[-4/(8-6)+7]}"    ...

华为机试—四则运算(数组解决)

题目:四则运算 问题描述: 输入一个只包含个位数字的简单四则运算表达式字符串,计算该表达式的值 注: 3.1、表达式只含 +, -, *, / 四则运算符,不含括号 3.2、表达式数值只包含...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:[华为机试真题]68.简单四则运算
举报原因:
原因补充:

(最多只允许输入30个字)