表达式计算

表达式求值

时间限制: 3000 ms  |  内存限制: 65535 KB
难度: 4
描述
ACM队的mdd想做一个计算器,但是,他要做的不仅仅是一计算一个A+B的计算器,他想实现随便输入一个表达式都能求出它的值的计算器,现在请你帮助他来实现这个计算器吧。
比如输入:“1+2/4=”,程序就输出1.50(结果保留两位小数)
输入
第一行输入一个整数n,共有n组测试数据(n<10)。
每组测试数据只有一行,是一个长度不超过1000的字符串,表示这个运算式,每个运算式都是以“=”结束。这个表达式里只包含+-*/与小括号这几种符号。其中小括号可以嵌套使用。数据保证输入的操作数中不会出现负数。
数据保证除数不会为0
输出
每组都输出该组运算式的运算结果,输出结果保留两位小数。
样例输入
2
1.000+2/4=
((1+2)*5+1)/4=
样例输出
1.50
4.00


思路:

可以利用两个栈来分别放数字和符号,这里因为可能出现浮点数,所以可以先把数字或小数点存放到一个字符数组里面然后利用sscanf来实现转换。

当读到一个符号的时候,就判断与前一个符号的优先级,如果比前面的低,说明可以把前面的两个数和前面的符号进行运算了。这里要注意括号 和等于号的处理,具体看代码

 
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <stack>

using namespace std;

char s[1005],st[1005];
int N;
stack<double> num;
stack<char> ch;

char cmp(char a, char b)
{
    if(a == '=')
    {
        if(b == '=')
            return '=';
        else
            return '<';
    }
    else if(a == '(')
    {
        if(b == ')')
            return '=';
        else
            return '<';
    }
    else if(a == '+' || a == '-')
    {
        if(b == '*' || b == '/' || b == '(')
            return '<';
        else
            return '>';
    }
    else if(a == '*' || a == '/')
    {
        if(b == '(')
            return '<';
        else
            return '>';
    }
}

double calc(double a, char c, double b)
{
    if(c == '+')
        return a+b;
    else if(c == '-')
        return a-b;
    else if(c == '*')
        return a*b;
    else if(c == '/')
        return a/b;
}


int main()
{
    scanf("%d", &N);
    while(N--)
    {
        scanf("%s", s);
        int len = strlen(s);
        int k = 0;
        bool flag = false;
        ch.push('=');
        for(int i=0;i<len;)
        {
            if(s[i] >= '0' && s[i] <= '9' || s[i] == '.')
            {
                st[k++] = s[i++];
                flag = true;
            }
            else
            {
                if(flag)
                {
                    st[k] = '\0';
                    double t;
                    sscanf(st, "%lf", &t);
                    num.push(t);
                    k = 0;
                    flag = false;
                }
                switch(cmp(ch.top(), s[i]))
                {
                case '<':
                    ch.push(s[i++]);
                    break;
                case '>'://注意这种情况不要++i了,因为前面的符号运算了,
                         //所以要继续判断当前符号与更前面符号的关系
                    double a,b;
                    b = num.top();
                    num.pop();
                    a = num.top();
                    num.pop();
                    num.push(calc(a, ch.top(), b));
                    ch.pop();
                    break;
                case '=':
                    ch.pop();
                    ++i;
                    break;
                }
            }
        }
        printf("%.2lf\n", num.top());
        num.pop();
    }
    return 0;
}
        



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
HTML 是一种用于创建网页的标记语言,它本身不支持表达式计算。但是,我们可以使用 JavaScript 来实现在 HTML 页面中进行表达式计算。JavaScript 是一种脚本语言,可以嵌入到 HTML 中,在浏览器端运行。 通过在 HTML 页面中嵌入 JavaScript 代码,我们可以实现简单的表达式计算。比如,我们可以在 HTML 页面中添加一个输入框和一个按钮,当用户输入一个表达式并点击按钮时,JavaScript 代码可以解析这个表达式计算结果,最后将结果显示在页面上。 下面是一个简单的 HTML 页面示例,其中包含一个输入框和一个按钮,点击按钮时会计算输入框中的表达式并显示结果: ```html <!DOCTYPE html> <html> <head> <title>表达式计算</title> <script> function calculate() { // 获取输入框中的表达式 var expr = document.getElementById("expr").value; // 使用 eval 函数计算表达式 var result = eval(expr); // 将结果显示在页面上 document.getElementById("result").innerHTML = result; } </script> </head> <body> <h1>表达式计算</h1> <input type="text" id="expr" /> <button onclick="calculate()">计算</button> <div id="result"></div> </body> </html> ``` 请注意,eval 函数可以将字符串解析为 JavaScript 代码并执行。因此,在使用 eval 函数时应该非常小心,避免安全问题。同时,在实际开发中,我们也应该使用更加严谨和安全的方法来进行表达式计算
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值