hdu1237简单计算器(模拟 + 栈)

简单计算器

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 25351    Accepted Submission(s): 9180


Problem Description
读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值。
 

Input
测试输入包含若干测试用例,每个测试用例占一行,每行不超过200个字符,整数和运算符之间用一个空格分隔。没有非法表达式。当一行中只有0时输入结束,相应的结果不要输出。
 

Output
对每个测试用例输出1行,即该表达式的值,精确到小数点后2位。
 

Sample Input
 
   
1 + 2 4 + 2 * 5 - 7 / 11 0
 

Sample Output
 
   
3.00 13.36

思路:运算符号无非乘除优先级大于加减,只要把加减压入栈内,乘除直接计算,题目本身很简单,主要是需要注意的地方有3点:

1、0 + 2 + ......是否可求

2、0     输出0

3、数字可以是多位(样例已给)

代码:(写的有点杂,将就看)

#include
#include
#include
using namespace std;
char str[305];
bool isdigit(char ch)
{
 if (ch >= '0' && ch <= '9')
  return true;
 return false;
}
int main()
{
 while (gets(str) && strcmp(str,"0") != 0)
 {
  double ans = 0,ty;
  stack s1;
  stack s2;
  int len = strlen(str),i;
  for (i = 0;i < len;i ++)
  {
   bool flag = false;
   ty = 0;
   while (isdigit(str[i]))
   {
    ty = ty * 10 + (str[i] - '0');
    i ++;
    flag = true;
   }
   if (flag)
   {
    s1.push(ty);
    continue;
   }
   if (str[i] == ' ') continue;
   else
   {
    if (str[i] == '*')
    {
     i ++;
     while (str[i] == ' ') i ++;
     double x = 0;
     while (isdigit(str[i]))
     {
      x = x * 10 + (str[i] - '0');
      i ++;
     }
     ty = s1.top() * x;
     s1.pop();
     s1.push(ty);
    }
    else if (str[i] == '/')
    {
     i ++;
     while (str[i] == ' ') i ++;
     double x = 0;
     while (isdigit(str[i]))
     {
      x = x * 10 + (str[i] - '0');
      i ++;
     }
     ty = s1.top() / x;
     s1.pop();s1.push(ty);
    }
    else
     s2.push(str[i]);
   }
  }
  while (!s2.empty())
  {
   if (s2.top() == '+')
   {
    ans += s1.top();s1.pop();
   }
   else
   {
    ans += - s1.top();s1.pop();
   }
   s2.pop();
  }
  ans += s1.top();
  s1.pop();
  printf("%.2lf\n",ans);
 }
 return 0;
}


你可能感兴趣的:(数据结构)