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<cstdio>
#include<cstring>
#include<stack>
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<double> s1;
  stack<char> 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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值