zoukankan      html  css  js  c++  java
  • 华为招聘机试整理5:简单四则运算

    华为招聘机试整理5:简单四则运算

    题目:简单四则运算
    问题描写叙述: 输入一个仅仅包括个位数字的简单四则运算表达式字符串,计算该表达式的值
    注:
    1、表达式仅仅含 +, -, 乘, / 四则运算符,不含括号
    2、表达式数值仅仅包括个位整数(0-9)。且不会出现0作为除数的情况
    3、要考虑加减乘除按通常四则运算规定的计算优先级
    4、除法用整数除法。即仅保留除法运算结果的整数部分。比方8/3=2。输入表达式保证无0作为除数情况发生
    5、输入字符串一定是符合题意合法的表达式,当中仅仅包括数字字符和四则运算符字符,除此之外不含其他不论什么字符,不会出现计算溢出情况
    要求实现函数:
    int calculate(int len,char expStr)
    【输入】 int len: 字符串长度;
    char
    expStr: 表达式字符串;
    【输出】 无
    【返回】 计算结果

    演示样例
    1) 输入:char expStr = “1+45-8/3”
    函数返回:19
    2) 输入:char expStr = “8/33”
    函数返回:6

    题目分析:
    ①这道题输入字符串中有可能有五种字符,数字、+、-、*、/。
    ②这道题还须要注意的是我们要依照运算法则来进行计算,所以我们要选择用栈来解决这道题
    算法思路:
    ①用字符串数组当做符号+-
    /的栈;用int数组作为数字的栈
    ②入栈过程:
    数字栈:检測假设为数字,我们直接-‘0’放入number中。
    符号栈:
    1)+ - :由于它们运算优先级比較低,所以我们须要入栈出栈
    检測为+-时候。我们直接放入sign中
    2)* / :由于运算优先级别比較高,所以哦我们能够直接运算
    这里须要注意索引,这个时候数字索引应该-1,可是字符串的索引应该加1,之后还须要+1(由于已经运算完了)
    /须要多注意一个地方,就是分母不能为0。为0时候。直接返回-1;
    ③出栈过程
    1)首先第一步我们须要把两个栈的索引都减去1
    2)之后用符号索引进行for循环。假设检測为加号。由于我们须要把数字都放入数字的前一个索引里面。数字索引须要减去1先。之后再运算
    3)最后出栈结束返回number[0]就能够了

    =====================================================================
    參考代码:

    //简单四则运算.cpp
    //2014.7.10 hepanhui
    #include <iostream>
    #include <string>
    #include <ctype.h>
    const int maxn = 1000;
    using namespace std;
    
    int calculate(int len, char *expStr)
    {
        //非法输入
        if(expStr == NULL)
            return -1;
    
        //定义一个char数组当做符号栈。int数组当做数字栈
        char sign[maxn];
        int sign_index = 0;
        int number[maxn];
        int number_index = 0;
    
        for(int i = 0; i < len; i++)
        {
            //堆栈过程
            if(isdigit(expStr[i]))
            {
                number[number_index ++] = expStr[i] - '0';
                continue;
            }
    
            if(expStr[i] == '+' || expStr[i] == '-')
            {
                sign[sign_index ++] = expStr[i];
                continue;
            }
    
            if(expStr[i] == '*')
            {
                number[number_index - 1] *= expStr[i+1] - '0';
                i++;
                continue;
            }
    
            if(expStr[i] == '/')
            {
                if(expStr[i+1] != '0')
                {
                    number[number_index - 1] /= expStr[i+1] - '0';
                    i++;
                    continue;
                }
                else
                    return -1;
    
            }
        }
    
        //出栈过程
            number_index--;
            sign_index--;
    
            for(int i = sign_index;i >= 0; i--)
            {
                if(sign[i] == '+')
                {
                    number_index --;
                    number[number_index] +=  number[number_index + 1];
                    continue;
                }
                if(sign[i] == '-')
                {
                    number_index --;
                    number[number_index] -=  number[number_index + 1];
                    continue;
                }
            }
    
            return number[0];
    }
    
    
    int main()
    {
        int len;
        cin >> len;
        char str[maxn];
        cin >> str;
        cout << calculate(len,str) << endl;
        return 0;
    }
    

    调试过程中易犯错误的地方:
    ①当子函数返回为int型时候。我们非法输入的时候一样不能写return 0 最好写return -1
    ②出栈的时候要特别注意先将索引直接-1;
    ④运算过程中也须要注意。我们也要先把数字索引减去1,为了终于返回number[0]保存终于结果。

  • 相关阅读:
    SCM基础之系统核心功能
    事件记录与变更请求
    SCM基础之配置管理功能
    SCM基础之好处
    SCM基础之配置管理实施
    善其事 利其器:快速制作SEO索引
    深入浅出之正则表达式(二)
    C# 读写文件方法总结
    C#常用正则式整理
    C#正则表达式类Match和Group类的理解
  • 原文地址:https://www.cnblogs.com/mqxnongmin/p/10944935.html
Copyright © 2011-2022 走看看