华为机试简单四则运算

原创 2013年12月02日 15:15:22

 简单四则运算


问题描述: 

输入一个只包含个位数字的简单四则运算表达式字符串,计算该表达式的值
注: 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+4*5-8/3”
函数返回:19
2
) 输入:char *expStr “8/3*3”
函数返回:6

 //以下代码实现了两种方法

 

#include

#include

#include

 

//这个算法开辟了额外的空间。

//分析这个问题可以知道,字符串长度len是奇数(0不考虑)

//数字的个数是len/2+1,符号的个数为len/2,然后将符号和数字存储起来

//第一步处理所有的乘除法,此时有一个特点就是如果几个数

//连续进行乘除法的时候就需要向前存储结果(为了方便后面的加减法运算)

//算法复杂度O(n)

 

int calculate(int len,char *expStr)

{

int i,j,k,answer;

int* num=(int*)malloc((len/2+1)*sizeof(int));

char* exp=(char*)malloc(len/2);

for (i=0,j=0,k=0;i

{

if(i%2==0)

num[j++]=expStr[i]-'0';

else

exp[k++]=expStr[i];

}

//乘除法处理

for (i=0,j=1;i

{

if (exp[i]!='*'&&exp[i]!='/')

{

j=1;

continue;

}

if (exp[i]=='*')

{

num[i+1]*=num[i];

for (k=0;k

{

num[i-k]=num[i+1];

}

j++;

}

else if (exp[i]=='/')

{

num[i+1]=num[i]/num[i+1];

for (k=0;k

{

num[i-k]=num[i+1];

}

j++;

}

}

//处理加减法

answer=num[0];

for (i=0,j=1;i

{

if (exp[i]=='+')

answer+=num[i+1];

else if (exp[i]=='-')

answer-=num[i+1];

}

return answer;

}


int main()

{

char* a="1+1+3*6";

int result=calculate(strlen(a),a);

//int result=calculate2(strlen(a),a);

printf("%d\n",result);

return 0;

}


//网上的答案,用栈进行操作

int calculate2(int len,char *expStr)  

{  

    struct  {  

        char opdata[200];  

        int top;  

    }opstack;  

    //定义操作符栈   

  

    opstack.top = -1;  

  

    int i=0;//遍历字符串的下标   

    int t=0;//当前后缀表达式的长度   

  

    char ch = expStr[i];  

  

    while (ch!='\0')  

    {  

        switch (ch)  

        {  

            case '+':  

            case '-':  

  while (opstack.top != -1)  

  {  

                    expStr[t] = opstack.opdata[opstack.top];  

                    opstack.top--;  

                    t++;  

                }  

                opstack.top++;  

               opstack.opdata[opstack.top] = ch;  

                break;  

            case '/':  

                while (opstack.top != -1 && (opstack.opdata[opstack.top] =='*' || opstack.opdata[opstack.top] =='/') )  

                {  

                    expStr[t] = opstack.opdata[opstack.top];  

                    opstack.top--;  

                    t++;  

                }  

                opstack.top++;  

                opstack.opdata[opstack.top] = ch;  

                break;  

            default:  

                expStr[t] = ch;  

                t++;  

                break;  

        }  

        i++;  

        ch = expStr[i];  

    }  

  

    while (opstack.top != -1)//将栈中所有的剩余的运算符出栈   

    {  

        expStr[t] = opstack.opdata[opstack.top];  

        opstack.top--;  

        t++;  

    }  

  

    expStr[t]='\0';  

  

  

    struct  {  

        int numeric[200];  

        int top;  

    }data;  

  

    data.top = -1;  

  

    i=0;  

    ch = expStr[i];  

  

  

    while (ch!='\0')  

    {  

        if (ch>='0' && ch <= '9' )  

        {  

            data.top++;  

            data.numeric[data.top] = ch-'0';  

        }   

        else if('+' == ch)  

        {  

            int tmp = data.numeric[data.top-1]  + data.numeric[data.top];  

            data.top--;  

            data.numeric[data.top] = tmp;  

        }  

        else if('-' == ch)  

        {  

            int tmp = data.numeric[data.top-1]  - data.numeric[data.top];  

            data.top--;  

            data.numeric[data.top] = tmp;  

        }  

        else if('*' == ch)  

        {  

            int tmp = data.numeric[data.top-1]  * data.numeric[data.top];  

            data.top--;  

            data.numeric[data.top] = tmp;  

        }  

        else if('/' == ch)  

       {  

            if(data.numeric[data.top] == 0)  

            {  

                printf("cannot be zero of the divide\n");  

                exit(1);  

            }  

            int tmp = data.numeric[data.top-1] / data.numeric[data.top];  

            data.top--;  

            data.numeric[data.top] = tmp;  

        }  

        i++;  

        ch = expStr[i];  

    }  

  

    return data.numeric[data.top];  

}

简单的四则运算

请你编写程序实现能处理两个数的+、-、*、/、%的表达式程序。数据的输入/输出全部使用标准输入/输出,输入数据的第一行为你需要计算表达式的个数,从第2行开始,每一行为你计算的一个表达式,每行数据中没有...
  • a997930294
  • a997930294
  • 2014年03月15日 08:20
  • 636

java简单计算器实现,只有四则运算

import java.awt.Color; import java.awt.FlowLayout; import java.awt.Toolkit; import java.awt.datatran...
  • zhanweihui
  • zhanweihui
  • 2016年11月29日 07:56
  • 1523

用java实现简单四则运算的算法

实现的功能例如:(12*3/-2)*(3+5)/2 = -72 应用场景:在计算器中输入一大串四则运算表达式,如何按下‘=’号,得出对应的正确结果,今天就来完成该功能的实现。思路分析首先拿到一个表...
  • HeadingAlong
  • HeadingAlong
  • 2017年01月29日 13:56
  • 2737

很简单的C++实现四则运算

网上看了些C++实现四则运算的文章,代码都很乱,在此给出自己实现的很简单的可运行代码。 /* * TestRPN.h * * C++实现整数四则运算 * * 有两个步骤, 一是convert...
  • liangtb
  • liangtb
  • 2015年03月18日 17:12
  • 4461

Java实现简单四则运算

工作之余,突然想用java实现一下四则运算,经过简单的构思,很快就有了思路,就完成了一个简单版本。 经过慎重考虑,觉得使用栈还是要比数组或者List容易对符号和数字进行控制。 我使用两个栈...
  • u013276512
  • u013276512
  • 2017年10月30日 14:36
  • 340

数据结构之简单四则运算表达式求值8-(栈的实现)

利用栈实现简单的四则运算,有待提升的地方有,不支持负数的运算,只支持0-9之间数值的计算 代码如下 #include #include #include using namespace s...
  • wwq2015
  • wwq2015
  • 2015年09月15日 17:34
  • 719

简单四则运算

问题描述:  输入一个只包含个位数字的简单四则运算表达式字符串,计算该表达式的值 注: 1、表达式只含 +, -, *, / 四则运算符,不含括号 2、表达式数值只包含个位整数(0-9),且...
  • u014082714
  • u014082714
  • 2015年03月18日 16:57
  • 799

简单的四则运算答题系统(Java版)

用Java写一个小的四则运算答题系统 1.前言 最近一直在用Python刷算法,在TensorFlow(简称掏粪)大坑里游得是不亦乐乎。不过昨天有个朋友叫我帮他的学弟写一个...
  • weixin_37669436
  • weixin_37669436
  • 2017年05月18日 00:23
  • 891

Linux实现四则运算的简单方法

在Linux shell里,我们可以利用$(()),将待计算的表达式放在括号中,即可达到目的。如下: 也可以利用expr实现,将需要运算的表达式放于expr之后,保证参数与运算符号中...
  • fjx1173865548
  • fjx1173865548
  • 2015年10月07日 13:25
  • 1270

编译原理---四则运算表达式的计算简单实现

编译原理---四则运算表达式的计算简单实现
  • u010251278
  • u010251278
  • 2016年09月05日 19:17
  • 3321
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:华为机试简单四则运算
举报原因:
原因补充:

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