首页 > 其他分享 >2024表达式求值

2024表达式求值

时间:2024-08-14 23:16:14浏览次数:9  
标签:运算符 ch int 2024 num 求值 include 表达式

P06330. 表达式求值

Description
一个数学表达式由下列元素组成:左括号,右括号,加号,减号,乘号,正号,负号,整数(无前导0)。

给出一个长度不超过100的数学表达式,求它的值,要求考虑括号和乘法的优先级,计算过程中的临时值的绝对值保证不会超过整数范围 。

给出的表达式保证合法以及符合人的书写习惯(但可能会有多余的括号对),没有空格符号。

以下表达式被认为是合法的:

((10+(-100))) ,-3*(+5+72)-(0) ,-0 ,(-3)(-5+7)。

以下表达式被认为非法:1+-7 ,--3+8 ,-3+() 。

Format
Input
一行,给出一个合法的表达式。

Output
如题

Samples
输入数据 1
-3*(+5-7*2)-(0)
输出数据 1
27

 

 

#include <iostream>
#include <cstring>
#include <algorithm>
#include <stack>
#include <unordered_map>
using namespace std;
stack<int> num;
stack<char> op;
int m;
char ch[200];
char str[200];
void eval() {
	// 由于栈先进后出的性质,a为倒数第二个数,b为倒数第一个数,因为顺序回影响减法和除法
	int b = num.top();
	num.pop();
	int a = num.top();
	num.pop();
	int c = op.top();
	op.pop();
	int x;
	if(c == '+') x = a + b;
	else if(c == '-') x = a - b;
	else if(c == '*') x = a * b;
	else x = a / b;
	num.push(x);
}
int main() 
{
	unordered_map<char, int> pr {{'+', 1}, {'-', 1}, {'*', 2}, {'/', 2}}; // 优先级
	cin >> ch + 1;
	int len = strlen (ch + 1);
	ch[0] = '(';
	ch[len + 1] = ')';
	//给输入原字符串最外层加上一对左右括号 
	m=0;
	for (int i = 0; i <= len+1; i ++) 
	//对于充当正负号的"+","-",在它的前面加个数字0 
	{
		if (ch[i - 1] == '(' && (ch[i] == '-' || ch[i] == '+'))
			str[++ m] = '0';
		str[++ m] = ch[i];
	}
	for(int i = 1; i <=m; i ++) 
	{
		char c = str[i];
		if(isdigit(c)) //如果输入的是一个数字字符,将其转成一个数字 
		{
			int j = i, x = 0;
			while(j <m&& isdigit(str[j]))
				x = x * 10 + str[j ++] - '0';
			i = j - 1; // 更新i的位置
			num.push(x);
		} 
		else 
		    if(c == '(') //如果是左括号,直接进栈 
			  op.push(c);
		    else 
			    if(c == ')') //如果是右括号,其比所有运算符的级别都要低,于是不断进行运算
				//直到遇到一个左括号 
			    {
			          while(op.top() != '(')
			          	   eval();
			          op.pop(); // 把'('pop掉
		        } 
				else 
				//既不是数字字符,也不是左右括号,其必然为运算符 
				    {
			              while(op.size() && op.top() != '(' && pr[op.top()] >= pr[c]) 
			              //只要放在运算符栈顶的运算符级别高于当前读入的字符
						  //则可取出运算符栈顶的运算符与数字所在栈顶的两个数字进行相关运算 
						       eval();
			              op.push(c);  //将当前字符加入运算符栈 
		            }
	}
	cout << num.top() << endl;
	return 0;
}

  

标签:运算符,ch,int,2024,num,求值,include,表达式
From: https://www.cnblogs.com/cutemush/p/18359945

相关文章

  • Lambda表达式
    lambda表达式基本概念:背景Lambda表达式是JavaSE8中一个重要的新特性。lambda表达式允许你通过表达式来代替功能接口。lambda表达式就和方法一样,它提供了一个正常的参数列表和一个使用这些参数的主体(body,可以是一个表达式或一个代码块)。Lambda表达式(Lambdaexpression)......
  • 禅道 未授权登录复现(QVD-2024-15263)
    侵权声明本文章中的所有内容(包括但不限于文字、图像和其他媒体)仅供教育和参考目的。如果在本文章中使用了任何受版权保护的材料,我们满怀敬意地承认该内容的版权归原作者所有。如果您是版权持有人,并且认为您的作品被侵犯,请通过以下方式与我们联系:[[email protected]]。我们将在确......
  • 2024.8.14 总结(集训)
    依然是TQX来讲字符串。/bx/bx/bx属于是两个上午速通字符串里一些重要的内容。上课时只有manacher和PAM是我有点听懂了的。于是下午看TQX的博客学了PAM,看之前看过的博客复习了下SAM,给why讲了些、和他讨论了PAM,AC了洛谷上的PAM板子,看TQX的PPT学了manache......
  • 2024华为OD机试真题-启动多任务排序(C++/Python)-C卷D卷-200分
    2024华为OD机试题库目录(Python、C++)-(C卷+D卷)-CSDN博客目录题目描述输入描述输出描述用例1题目解析代码c++python题目描述一个应用启动时,会有多个初始化任务需要执行,并且任务之间有依赖关系,例如A任务依赖B任务,那么必须在B任务执行完成之后,才能开始执行A任务。......
  • 2024.8.14 test
    A一棵树,你每天可以选择不超过\(m\)个祖先都被选择的点,问最少多少天选完。\(n\le10^5\)。考虑贪心,每次选出子树深度最大的\(m\)个点或子树大小最大的\(m\)个点都是对的。B一棵树\(n\le5e5\),选若干出来,对于每个点,如果其儿子有选,那么不能被选,否则其有\(p_u\)概率被选......
  • 2024版,一键安装永久激活!
    2024版,一键安装永久激活!https://mp.weixin.qq.com/s?__biz=MzkxMzEyNTA2Nw==&mid=2247504674&idx=1&sn=6402cfd91b92f85e28a282fe10216aea&chksm=c100e886f67761904f3eab4607504da67c7342d29cb6ae4374a9f9b4b459d237f1bee0095510&mpshare=1&scene=23&sr......
  • 河南萌新联赛2024第(五)场:信息工程大学
    河南萌新联赛2024第(五)场:信息工程大学前言有点水这场,原题和板子貌似有点多。。A-日历游戏_河南萌新联赛2024第(五)场:信息工程大学(nowcoder.com)思路首先不看年份的话,显然\(8/1\)败,\(7/31\)胜,\(7/30\)败,\(7/29\)胜,\(\dots\),以此类推,就能发现一个\((m+d)\bmod2=0\)\((m......
  • [考试记录] 2024.8.14 csp-s模拟赛20
    [考试记录]2024.8.13csp-s模拟赛2090+39+0+0还是太......
  • 【四六级备考经验分享】历年英语四六级真题及答案+听力音频+2024年6月三套
    每个大学生都要面对英语四六级考试的挑战,本以为高考结束后能松口气,没想到还得继续在英语学习的道路上奋斗。作为一位已经成功攻克这一难关的学姐,我想分享一些实用的备考资料和建议,助你一臂之力,一次性通过四六级考试!英语四六级备考资料:一、历年英语四级真题及答案:www.201800.com/......
  • 2024.8.14 鲜花
    OnlyMyRailgun放て!心に刻んだ梦を未来さえ置き去りにして限界など知らない意味无い!この能力(チカラ)が光散らすその先に遥かな想いを歩いてきたこの道を振り返ることしか出来ないなら…今ここで全てを壊せる暗闇に堕ちる街并み人はどこまで立ち向かえるの?加......