• 简单四则运算


     简单四则运算

    问题描述:

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

    注:

    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

      1 #include<stdio.h>
      2 template <typename T>
      3 class MyStack{
      4     int top;
      5     int sum;
      6     T a[100];
      7 public:
      8     MyStack(){top = -1; sum = 0;}
      9     T getTop(){return a[top];}
     10     int getSize(){return sum;}
     11     bool pop()
     12     {if(top >=0)
     13         {
     14             top--;
     15             sum--;
     16             return true;
     17         }
     18         else return false;
     19     }
     20     bool push(T value)
     21     {
     22         if (top >= 99)
     23             return false;
     24         else
     25         {
     26             a[++top] = value;
     27             sum++;
     28         }
     29     }
     30 
     31 };
     32 int switchCal(char c)
     33 {
     34     switch(c)
     35     {
     36     case '+':
     37     case '-':
     38         return 1;
     39     case '*':
     40     case '/':
     41         return 2;
     42     default:
     43         return 0;
     44     }
     45 }
     46 int calc(char c,int i,int j)
     47 {
     48     switch(c)
     49     {
     50     case '+': return i+j;
     51     case '-': return i-j;
     52     case '*': return i*j;
     53     case '/': return i/j;
     54     default:
     55         return 0;
     56     }
     57 }
     58 
     59 int calculate(int len, char *expStr)
     60 {
     61     char *p = expStr;
     62     int i,j;
     63     MyStack<int> num;
     64     MyStack<char> cal;
     65     while (*p != '')
     66     {
     67         if (cal.getSize() > 0 && switchCal(cal.getTop()) == 2 )
     68         {
     69             i = num.getTop();
     70             printf("
    ");
     71             printf("pop: %d ",i);
     72             num.pop();
     73             j = *p - '0';
     74             p++;
     75             printf("jump: %d ",j);
     76             printf(" calculate %c ",cal.getTop());
     77             i = calc(cal.getTop(),i,j);
     78             cal.pop();
     79             num.push(i);
     80             printf("push: %d ",i);
     81         }
     82         if (*p == '')
     83             break;
     84         if (*p >= '0' && *p <= '9')
     85             {
     86                 i = *p - '0';
     87                 printf("push: %d ",i);
     88                 num.push(i);
     89             }
     90         else
     91         {
     92             cal.push(*p);
     93             printf("push: %c ",*p);
     94         }
     95         p++;
     96     }
     97     while (cal.getSize())
     98     {
     99         i = num.getTop();
    100         num.pop();
    101         j = num.getTop();
    102         num.pop();
    103         i = calc(cal.getTop(),j,i);
    104         cal.pop();
    105         num.push(i);
    106     }
    107     printf("
    ");
    108     return num.getTop();
    109 }
    110 int main()
    111 {
    112     int len;
    113     char str[100];
    114     scanf("%d%s",&len,str);
    115     printf("%d
    ",calculate(len,str));
    116 }

    这题还有点麻烦,忘记怎么把中缀式改为前缀式了~呀。。。。

    只能用中缀式计算了,还好输入那么完美

  • 相关阅读:
    <转>MSDN上关于XPath的语法文章
    <转>正则表达式语法
    <转>反射技术的简单介绍
    <转>css中用expression实现js的onmouseover/onmouseout事件
    <转>在xslt中实现split方法对查询字符串进行分隔
    <转>SQL Server中的XML数据进行insert、update、delete
    <转>VS2010项目转换到VS2008下方法
    <转>在xslt 1.0 中取得当前时间
    C# 发送邮件的Helper类
    DataTable 类的学习笔记
  • 原文地址:https://www.cnblogs.com/george-cw/p/3938232.html
Copyright © 2020-2023  润新知