NYOJ35 表达式求值【栈】

2024-06-15 05:48
文章标签 求值 表达式 nyoj35

本文主要是介绍NYOJ35 表达式求值【栈】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

表达式求值
时间限制: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


来源 

数据结构课本例题改进 


上传者 

张云聪


题目大意:给你一个计算表达式,求出最终结果。

思路:用两个栈来分别存数和操作符, 遇到'(',操作符入栈,遇到')',计算括号内的

式子。遇到'+'、'-'、'*'、'/'就比较当前运算符与栈中运算符的优先级,大于等于于栈

中优先级就计算,否则就入栈,留待下次计算。最后计算栈中剩下优先级低的相应式子


#include<iostream>
#include<algorithm>
#include<stack>
#include<string>
#include<cstring>
#include<cstdio>
using namespace std;stack<double> num;
stack<char> oper;
char a[1010],buf[1010];int CmpValue(char op)
{if(op=='(' )return 0;if(op=='+' || op=='-')return 1;if(op=='*' || op=='/')return 2;
}
void calc()
{double x,y;char op;if(num.size()>=2 && !oper.empty()){y = num.top();num.pop();x = num.top();num.pop();op = oper.top();if(op=='+')num.push(x+y);else if(op=='-')num.push(x-y);else if(op=='*')num.push(x*y);else if(op=='/')num.push(x/y);oper.pop();}
}int main()
{int N;cin >> N;while(N--){memset(a,0,sizeof(a));memset(buf,0,sizeof(buf));scanf("%s",a);int i = 0;while(1){if(isalnum(a[i])){double d;sscanf(a+i,"%lf",&d);num.push(d);while(isalnum(a[i]) || a[i]=='.')i++;}char c = a[i++];if(c=='=' || c=='\0')break;if(c=='(')oper.push(c);else if(c==')'){while(!oper.empty()){if(oper.top()=='('){oper.pop();break;}calc();}}else{while(!oper.empty() && CmpValue(c) <= CmpValue(oper.top())){calc();}oper.push(c);}}while(!oper.empty())calc();printf("%.2lf\n",num.top());while(num.empty())num.pop();}return 0;
}



这篇关于NYOJ35 表达式求值【栈】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1062589

相关文章

Python19 lambda表达式

在 Python 中,lambda 表达式是一个小型匿名函数,通常用于实现简单、单行的函数。lambda 函数可以接受任意数量的参数,但只能有一个表达式。 基本语法: lambda arguments: expression 这里,arguments 是传递给 lambda 的参数,expression 是关于这些参数的表达式,它的计算结果就是 lambda 函数的返回值。 使用

java8的新特性之一(Java Lambda表达式)

1:Java8的新特性 Lambda 表达式: 允许以更简洁的方式表示匿名函数(或称为闭包)。可以将Lambda表达式作为参数传递给方法或赋值给函数式接口类型的变量。 Stream API: 提供了一种处理集合数据的流式处理方式,支持函数式编程风格。 允许以声明性方式处理数据集合(如List、Set等)。提供了一系列操作,如map、filter、reduce等,以支持复杂的查询和转

【Qt笔记①】帮助文档、窗口、按钮、信号和槽、lambda表达式

学习第一天:2024-3-9 文章目录 Qt creator 快捷键帮助文档默认生成的main.cpp逐行解释核心类帮助文档的查阅方法-①代码创建按钮第一个第二个对窗口的其他设置 对象树窗口坐标系信号和槽(优点:松散耦合)帮助文档的查阅方法-②找信号函数的方法找槽函数的方法 自定义信号和槽 lambda表达式练习MenuTool Qt creator 快捷键 运行:ctrl

jsp脚本、jsp声明、jsp表达式

<strong><span style="font-size:14px;">jsp脚本 </span></strong><%out.println("这句将输出在浏览器里面,是jsp脚本"); %><%System.out.println("这句将输出在控制台console而不会在浏览器里面输出且查看源代码这一句也是隐藏的"); %> jsp声明变量,方法的格式<%! xxx;%> 举

SQL Plu计算算数表达式及SQL Plus下清屏快捷键

用PL/SQL数据库语言计算sqrt(58+25*3+(19-9)^2)的值 SQL Plus下清屏快捷键是host cls或者 clear screen PL/SQL计算乘方是2个*号:

js函数声明与函数表达式的区别

在JavaScript中,函数可以通过函数声明和函数表达式两种方式进行定义。 函数声明是通过关键字function和函数名来定义的,例如: function add(a, b) {return a + b;} 函数表达式是将函数赋值给一个变量或者存储在一个对象的属性中,例如: var subtract = function(a, b) {return a - b;}; 两

学懂C#编程:常用高级技术——学会Lambda表达式的应用(二)

上一篇介绍了Lambda基础的知识,接着我们通过讲解Lambda的几种应用场景来彻底学懂Lambda在编程中的应用。 Lambda表达式在C#中非常灵活,可以用在多种场合。以下是一些Lambda表达式示例,帮助你更全面地理解其用途: 1. 数组过滤(使用Where) int[] numbers = { 1, 2, 3, 4, 5, 6 };var evenNumbers = numbers

使用 C++11 Lambda 表达式在 Qt 中连接信号与槽

在 Qt 使用 C++11 引入的 lambda 表达式来简化信号与槽的连接已经成为一种不错的选择。本文将通过一个简单的例子来展示如何使用 lambda 表达式来连接 QAction 的信号与槽。 传统的连接方式 首先,看看传统的连接方式: QAction* action = foo->addAction(tr("Some Action"));connect(action, SIGNAL(

【408考点之数据结构】表达式求值和括号匹配

表达式求值和括号匹配 表达式求值 表达式求值是计算机科学中的一个基本问题,涉及将数学表达式转换为计算机可以理解和处理的形式。通常,我们使用栈来辅助求值过程,特别是在处理中缀表达式转后缀表达式和后缀表达式求值时。 中缀表达式转后缀表达式 中缀表达式(如a + b * c)是我们通常书写数学表达式的形式。为了方便计算机处理,我们将其转换为后缀表达式(逆波兰表达式,RPN)。转换过程如下: 扫

表达式求值(无括号、无空格、每个数0-9、有运算符优先级)

/*表达式求值(无括号、无空格、每个数0-9、有运算符优先级)简单四则运算问题描述:输入一个只包含个位数字的简单四则运算表达式字符串,计算该表达式的值注1、表达式只含 +, -, *, / 四则运算符,不含括号2、表达式数值只包含个位整数(0-9),且不会出现0作为除数的情况3、要考虑加减乘除按通常四则运算规定的计算优先级4、除法用整数除法,即仅保留除法运算结果的整数部分。比如8/