47

问答题 47 /85

简单四则运算问题描述:输入一个只包含个位数字的简单四则运算表达式字符串,计算该表达式的值

注:

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 <stdio.h>
#include <string.h>
#include "assert.h"
struct stack
{
    //存放后续排列的表达式,模拟栈
    char str[80];
    int top;
};
struct sstack
{
    //存放计算表达式的值,模拟栈???
    int str[80];
    int top;
};
int calculate(int len, char *expStr)
{
    char *postexp = new char[len + 1];
    stack opstack;
    sstack calstack;
    calstack.top = -1;
    opstack.top = -1;
    int i = 0;
    int k = 0;
    while (expStr[i] != '\0')
    {
        if (expStr[i] >= '0' && expStr[i] <= '9')
        {
            postexp[k++] = expStr[i];
        }
        else if (expStr[i] == '+' || expStr[i] == '-')
        {
            while (opstack.top >= 0)
            {
                postexp[k++] = opstack.str[opstack.top--];
            }
            opstack.top++;
            opstack.str[opstack.top] = expStr[i];
        }
        else if (expStr[i] == '*' || expStr[i] == '/')
        {
            while (opstack.top >= 0 && (opstack.str[opstack.top] == '*'
                                        || opstack.str[opstack.top] == '/'))
            {
                postexp[k++] = opstack.str[opstack.top--];
            }
            opstack.top++;
            opstack.str[opstack.top] = expStr[i];
        }
        i++;
    }
    while (opstack.top >= 0)
    {
        postexp[k++] = opstack.str[opstack.top--];
    }
    int temp1 = 0;
    int temp2 = 0;
    for (i = 0; i < len; i++)
    {
        if (postexp[i] >= '0' && postexp[i] <= '9')
        {
            calstack.top++;
            calstack.str[calstack.top] = postexp[i] - '0';
        }
        else if (postexp[i] == '+')
        {
            temp1 = calstack.str[calstack.top--];
            temp2 = calstack.str[calstack.top];
            calstack.str[calstack.top] = temp2 + temp1;
        }
        else if (postexp[i] == '-')
        {
            temp1 = calstack.str[calstack.top--];
            temp2 = calstack.str[calstack.top];
            calstack.str[calstack.top] = temp2 - temp1;
        }
        else if (postexp[i] == '*')
        {
            temp1 = calstack.str[calstack.top--];
            temp2 = calstack.str[calstack.top];
            calstack.str[calstack.top] = temp2 * temp1;
        }
        else if (postexp[i] == '/')
        {
            temp1 = calstack.str[calstack.top--];
            temp2 = calstack.str[calstack.top];
            calstack.str[calstack.top] = temp2 / temp1;
        }
    }
    printf("%d\n", calstack.str[calstack.top]);
    return calstack.str[calstack.top];
}
main()
{
    char *expStr = "6+8*4-9/2";
    int len = strlen(expStr);
    calculate(len, expStr);
    return 0;
}