hdu1237简单表达式求值(多判断了())

本文介绍了一个简单的非负整数表达式计算器的设计与实现过程,包括如何读取包含加减乘除运算的表达式,并计算其值。文章详细阐述了使用栈和队列来处理表达式的算法流程,同时提供了完整的C++代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

简单计算器

 

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

 

 

 

Problem Description

 

 

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

 

Input

 

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

 

Output

 

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

 

Sample Input

 

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

 

Sample Output

 

 
3.00 13.36
 

 

Source

 

ps:参考算法笔记
 
 
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <stack>
#include <queue>
#include <map>
using namespace std;
typedef long long LL;
using namespace std;
#define INF 0x3f3f3f3f
#define mod 1000000007
#define N 1100
struct node{
    char op;
    double num;
    int flog;
}t,sum;
char ch[N];
stack<node>s;
queue<node>q;
map<char,int>mp;
void change()
{
    int len=strlen(ch);
    for(int i=0;i<len;) {
        if(ch[i]==' ') {
            i++;
            continue;
        }
        else if(ch[i]>='0'&&ch[i]<='9') {
            t.num=(ch[i]-'0');
            t.flog=1;
            i++;
            while(ch[i]>='0'&&ch[i]<='9') {
                t.num=t.num*10+ch[i++]-'0';
            }
            q.push(t);
        }
        else if(ch[i]=='('||ch[i]==')') {
            if(ch[i]=='(') {
                t.flog=0;
                t.op='(';
                s.push(t);
            }
            else {
                while(!s.empty()&&s.top().op!='(') {
                    q.push(s.top());
                    s.pop();
                }
                s.pop();
            }
            i++;
        }
        else {
            t.flog=0;
            while(!s.empty()&&s.top().op!='('&&mp[ch[i]]<=mp[s.top().op]) {
                q.push(s.top());
                s.pop();
            }
            t.op=ch[i++];
            s.push(t);
        }
    }
    while(!s.empty()) {
        q.push(s.top());
        s.pop();
    }
}
double cal()
{
    double t1,t2;
    while(!q.empty()) {
        t=q.front();
        q.pop();
        if(t.flog==1)   s.push(t);
        else {
            t2=s.top().num;
            s.pop();
            t1=s.top().num;
            s.pop();
            sum.flog=1;
            if(t.op=='-')
                sum.num=t1-t2;
            if(t.op=='+')
                sum.num=t1+t2;
            if(t.op=='*')
                sum.num=t1*t2;
            if(t.op=='/')
                sum.num=t1/t2;
            s.push(sum);
        }
    }
    return s.top().num;
}
int main()
{
    mp['+']=mp['-']=1;
    mp['*']=mp['/']=2;
    while(gets(ch)) {
        if(ch[0]=='0'&&strlen(ch)==1)
            break;
        while(!s.empty())
            s.pop();
        change();
        printf("%.2lf\n",cal());
    }
}

 

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值