hdu1237 xynuoj1650 简单计算器 字符串

模拟四则运算过程,对于整个输入的串,

遇到数字则提取出来进数字栈,

遇到加减运算则进运算符栈,

遇到乘除运算则从数字栈中拿出栈顶元素与运算符之后提取出的整数进行运算并将结果进数字栈,

这样当枚举完整个串的元素后,我们就得到了一个只有加减运算的表达式,但因为这个表达式在栈中的顺序是反的,所以要再开两个栈来将这个表达式反序,之后就每次从数字栈栈顶取出两元素,从运算符栈中取出一个运算符,将运算结果压进数字栈中,最后数字栈剩下的一个元素即为表达式的最终结果 。




#include<cstdio>

#include<cstring>
#include<iostream>
#include<stack>
using namespace std;


int main()
{
char s[250];
while(gets(s)&&strcmp(s,"0"))
{
int len=strlen(s);
int i,j;
stack<double>num;//存储整数 
stack<char>op;//存储运算符 
for(i=0;i<len;i++)//遍历字符串开始处理 
{
if(s[i]==' ')//空格直接跳过
continue;
else if(s[i]=='*'||s[i]=='/')//乘法除法运算符,运算完后将结果入栈 
{
double x=num.top();//拿出数字栈中的栈顶元素 
num.pop();
double y=0;
for(j=i+2;j<len;j++)//提取出字符串中的整数 
{
if(s[j]!=' ')
y=y*10+s[j]-'0';
else
break;
}
if(s[i]=='*')
num.push(x*y);
else
num.push(x/y);
i=j;//更新遍历字符串的位置 
}
else if(s[i]=='+'||s[i]=='-')//加法减法运算符,先进栈 
op.push(s[i]);
else//提取数字进数字栈 
{
double y=0;
for(j=i;j<len;j++)
{
if(s[j]!=' ')
y=y*10+s[j]-'0';
else
break;
}
i=j;
num.push(y);
}

//因为进栈之后出栈顺序与运算顺序相反,所以要将栈内元素反转
stack<double>num2;
stack<char>op2; 
while(!num.empty())
{
double temp=num.top();
num2.push(temp);
num.pop();
}
while(!op.empty())
{
char temp=op.top();
op2.push(temp);
op.pop();
}
while(!num2.empty()&&!op2.empty())
{
double x=num2.top();//拿出第一个整数 
num2.pop();
double y=num2.top();//拿出第二个整数 
num2.pop();
char optemp=op2.top();
op2.pop();
if(optemp=='+')
num2.push(x+y);
else
num2.push(x-y);
}
printf("%.2lf\n",num2.top());
num2.pop();
}
return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值