HDU 1237 简单计数器
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1237
题目分析以及方法:
用栈来写,将运算符与数字分别压入不同的栈,然后分别讨论不同情况,(这个题目相比栈的运算简单些,因为他的运算符只有"+,-,*,/")
代码实现:
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<stack>
#include<cctype>//isdigit(ch)判断一个字符是否是十进制数
//简单计算器//栈的四则运算 OPTR 操作符,OPND 操作数
using namespace std;
int main()
{
stack<double>OPND ;
stack<char>OPTR;
string a;
double d1,d2;
while(getline(cin,a)&&a !="0")
{
for(int i=0;a[i]; i++ )
{
if(isdigit(a[i]))
{
double s=0;
while(isdigit(a[i]))
{
s=s*10+a[i]-'0';
i++;
}
i--;
OPND.push(s);
}else if(a[i]=='+'||a[i]=='-')
{
if(OPTR.empty())
OPTR.push(a[i]);
else
{
char ch;
ch=OPTR.top();
OPTR.pop();
d1=OPND.top();
OPND.pop();
d2=OPND.top();
OPND.pop();
OPTR.push(a[i]);
if(ch=='+')
OPND.push(d1+d2);
else
OPND.push(d2-d1);
}
}else if(a[i]=='*'||a[i]=='/')
{
char ch =a[i];
i+=2;//因为运算符和运算数之间有一个空格
d2 = 0;
while(isdigit(a[i])) {
d2 = d2 * 10 + a[i] - '0';
i++;
}
i--;
d1=OPND.top();
OPND.pop();
if(ch=='*')
OPND.push(d1*d2) ;
else
OPND.push(d1/d2) ;
}
}
while(!OPTR.empty())
{
double d1,d2;
char ch;
ch=OPTR.top();
OPTR.pop();
d1=OPND.top();
OPND.pop();
d2=OPND.top();
OPND.pop();
if(ch=='+')
OPND.push(d1+d2);
else
OPND.push(d2-d1);
}
printf("%.2f\n", OPND.top());
}
}