20-表达式求值

/*
表题目内容:

输入一个由数字、+,-,*,/ 组成的算术表达式,求其值。

输入描述

一个表达式,其中每个运算数为正整数

输出描述

计算结果,保留2位小数

输入样例

1+12*3-4/2

输出样例

35.00
 
*/
#include <iostream>
#include <cstdio>
#include <stack>
using namespace std;
    
int fu(char ch){
    if(ch == ‘#‘ || ch == ‘=‘)
        return 0;
    if(ch == ‘-‘ || ch == ‘+‘)
        return 1;
    if(ch == ‘*‘ || ch == ‘/‘)
        return 2;    
}

void qiuzhi(string str){
    int i = 0;
    stack <double>s;  //数字栈
    stack <char>f;    //符号栈    优先级低的高的进栈,比栈顶低,则弹出栈顶的进行运算,直到比栈顶高才进栈
    f.push(‘#‘);
    while(str[i]){
        int a = 0, flag = 0;
        while(str[i] >= ‘0‘ && str[i] <= ‘9‘){
            a = a * 10 + str[i] - ‘0‘;
            i++;
            flag = 1;
        }
        if(flag)
            s.push(a);
        if(fu(str[i]) >= fu(f.top())){
            f.push(str[i]);  
            i++;    
        }
        int flag1 = 0;
        while(fu(str[i]) < fu(f.top())){
            char ch = f.top();
            f.pop();
            double c, d, e;
            c = s.top(); s.pop();
            d = s.top(); s.pop();
            if(ch == ‘-‘)
                e = d - c;
            else if(ch == ‘+‘)
                e = d + c;            
            else if(ch == ‘*‘)
                e = d * c;
            else if(ch == ‘/‘)
                e = d * 1.0 / c;        
            s.push(e);
//            f.push(str[i]);    
            flag1 = 1;
        }
        if(flag1){
            if(str[i] == ‘=‘){
                double sum = s.top();
                printf("%.2lf", sum);
//                cout << sum;
                return;
            }
            f.push(str[i]);
            i++;
        }
    }
}

int main(){
    string str;
    cin >> str;
    str += ‘=‘;
    qiuzhi(str);    
//    cout << str;
    return 0;
}

时间: 2024-10-27 12:28:22

20-表达式求值的相关文章

四则运算表达式求值 OpenJ_Bailian - 4132

四则运算表达式求值 OpenJ_Bailian - 4132 题意:设计一个计算器,实现+-*/以及()的表达式运算求值. 栈的应用,这学期学数据结构,手写了栈练一下~ 1 #include <bits/stdc++.h> 2 using namespace std; 3 const int maxn=10010; //最大表达式长度 4 5 template <typename T> 6 class Stack; 7 8 template <typename T> 9

表达式求值

表达式求值 时间限制:3000 ms  |  内存限制:65535 KB 难度:3 描写叙述 Dr.Kong设计的机器人卡多掌握了加减法运算以后,近期又学会了一些简单的函数求值,比方,它知道函数min(20,23)的值是20 ,add(10,98) 的值是108等等.经过训练,Dr.Kong设计的机器人卡多甚至会计算一种嵌套的更复杂的表达式. 如果表达式能够简单定义为: 1. 一个正的十进制数 x 是一个表达式. 2. 假设 x 和 y 是 表达式,则 函数min(x,y )也是表达式,其值为x

数据结构算法C语言实现(八)--- 3.2栈的应用举例:迷宫求解与表达式求值

一.简介 迷宫求解:类似图的DFS.具体的算法思路可以参考书上的50.51页,不过书上只说了粗略的算法,实现起来还是有很多细节需要注意.大多数只是给了个抽象的名字,甚至参数类型,返回值也没说的很清楚,所以很多需要自己揣摩.这也体现了算法和程序设计语言的特点,算法更侧重本质的描述,而任何编程语言都要照顾到实现的细节以及数据类型等语法方面的需求. 表达式求值: [编码中....] 二.头文件 迷宫求解: 1 //3_2_maze.h 2 /** 3 author:zhaoyu 4 email:[em

四则运算表达式求值の各种心碎

实验三---四则运算表达式求值 一.基本要求: ( 1 ) 利用二叉树后序遍历来实现表达式的转换,同时可以使用实验三的结果来求解后缀表达式的值. ( 2) 输入输出格式: 输入格式:在字符界面上输入一个中缀表达式,回车表示结束. 请输入表达式: 输入一个中缀表达式 输出格式:如果该中缀表达式正确,那么在字符界面上输出其后缀表达式,其中后 缀表达式中两相邻操作数之间利用空格隔开:如果不正确,在字符界面上输出表达式错误提示. 逆波兰表达式为: 输出逆波兰表达式 运算结果为:输出运算后的结果 测试数据

JAVA-栈实现中序表达式求值

中序表达式对我们而言是很直观的(我们平时接触的就是这个),但计算机处理起来比较麻烦(括号.优先级之类的),前序和后序表达式中没有括号,而且在计算中只需单向扫描,不需要考虑运算符的优先级.如2*3/(2-1)+3*(4-1) 前序表达式就是前缀表达式,不含括号的算术表达式,而且它是将运算符写在前面,操作数写在后面的表达式,例如:+/*23-21*3-4,也称为"波兰式". 后序表达式与前序表达式扫描方式正好相反,例如:23*21-/341-*+. 用两个栈实现中序表达式求值,表达式中只支

数据结构 -- 整数算术表达式求值 (C/C++)

数据结构题集(C语言版)--严蔚敏,吴伟民编著 设置运算符栈和运算数栈辅助分析运算符有限关系. 读入表达式的字符序列的同时完成运算符和运算数(整数)的识别处理,以及相应的运算. 在识别出运算数的同时,要将其字符序列形式转换成整数形式. 1 /** 2 Function:整数算术表达式求值 3 Date:2014-11-10 4 Author:JackDawson 5 Compiler:gcc version 4.8.1 6 */ 7 #include <iostream> 8 #include

栈的两个应用:括号匹配的检验和表达式求值

1.     括号匹配的检验 假设表达式中含有3种括号:(),[],{},其嵌套的顺序随意.检验括号是否匹配. 基本思想:在算法中设置一个栈,每读入一个括号,若是右括号,则或者与栈顶匹配的左括号相互消解,或者是不合法的情况:若是左括号,则直接压入栈中.若括号匹配,在算法的开始和结束时,栈都应该是空的. 代码: /* * 判断表达式中的括号是否匹配,匹配输出Yes,否则输出No * {(zhang)+[lei]+{lei}={zhangleilei}} -> Yes * {(zhang)+[lei

表达式求值_栈

问题 C: 表达式求值 时间限制: 3 Sec  内存限制: 128 MB提交: 1  解决: 1[提交][状态][讨论版] 题目描述 ACM队的mdd想做一个计算器,但是,他要做的不仅仅是一计算一个A+B的计算器,他想实现随便输入一个表达式都能求出它的值的计算器,现在请你帮助他来实现这个计算器吧.比如输入:“1+2/4=”,程序就输出1.50(结果保留两位小数) 输入 第一行输入一个整数n,共有n组测试数据(n<10).每组测试数据只有一行,是一个长度不超过1000的字符串,表示这个运算式,每

算法-表达式求值

今天在网上看到Dijkstra双栈算术表达式求值算法,可以用来实现计算器类型的app,以前很早的时候知道通过算术栈和数值栈搞定的,这次用OC通过数组实现了预期的效果,编程语言系统一般都内置了对算术表达式的处理,我们可以简易的模仿一下算术表达式处理机制,思想不变,主要是实现方式略有不同.算术表达式可能是一个数.或者是由一个左括号.一个算术表达式.一个运算符.另一个算术表达式和一个右括号组成的表达式.为了简化问题,这里定义的是未省略括号的算术表达式,它明确地说明了所有运算符的操作数,形式如下:(1+

hdu 4192(表达式求值)

题意:给一个表达式当中有一些变量,然后告诉你一些数字你可以任意排列,问能不能求出要求的结果. 思路:由于变量数目较小所以直接全排列枚举即可,然后用栈处理表达式. 代码如下: 1 /************************************************** 2 * Author : xiaohao Z 3 * Blog : http://www.cnblogs.com/shu-xiaohao/ 4 * Last modified : 2014-06-28 21:50 5