华为招聘机试整理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]保存最终结果。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值