首页 > 其他分享 >考研数据结构——每日一题[表达式求值]

考研数据结构——每日一题[表达式求值]

时间:2023-07-30 17:05:29浏览次数:39  
标签:考研 运算符 括号 num eval 求值 数据结构 表达式 op

3302. 表达式求值

给定一个表达式,其中运算符仅包含 +,-,*,/(加 减 乘 整除),可能包含括号,请你求出表达式的最终值。

注意:

数据保证给定的表达式合法。 题目保证符号 - 只作为减号出现,不会作为负号出现,例如,-1+2,(2+2)*(-(1+1)+2) 之类表达式均不会出现。 题目保证表达式中所有数字均为正整数。 题目保证表达式在中间计算过程以及结果中,均不超过 231−1。 题目中的整除是指向 0 取整,也就是说对于大于 0 的结果向下取整,例如 5/3=1,对于小于 0 的结果向上取整,例如 5/(1−4)=−1。 C++和Java中的整除默认是向零取整;Python中的整除//默认向下取整,因此Python的eval()函数中的整除也是向下取整,在本题中不能直接使用。 输入格式 共一行,为给定表达式。

输出格式 共一行,为表达式的结果。

数据范围 表达式的长度不超过 10^5^。

输入样例: (2+2)*(1+1) 输出样例: 8

表达式求值【正常数学计算表达式书写顺序】

简记 : eval计算函数 , op,num栈 , 定义优先级hash表,'('与')'特判 :重点优先级分支处理 最后处理剩余运算符,最终结果存在num栈顶 易错eval()第二个操作数b先出栈,第一个操作数a后出栈



#include <iostream>
#include <cstring>
#include <algorithm>
#include <unordered_map>//三个参数key,value,类(一般省略)
#include <stack>

using namespace std;

stack<char> op;//运算符栈
stack<int> num;//数值栈

void eval()//计算函数 【弹栈op一个c,num两个a,b: 操作数a 运算符c 操作数b  根据运算符判断运算方式 计算结果x存回数值栈 】
{
	auto b = num.top(); num.pop();//易错点:第二个操作数先出栈 
    auto a = num.top(); num.pop();//易错点:第一个操作数后出栈 
    auto 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()
{
    string s;//字符串
    cin >> s;

    unordered_map<char, int> pr{{'+', 1}, {'-', 1}, {'*', 2}, {'/', 2}};//运算符优先级 (key,value),key唯一标识,value值代表运算优先级大小
    for (int i = 0; i < s.size(); i ++ )
    {
        if (isdigit(s[i]))//判断是否为数字
        {
            int j = i, x = 0;//j指针记录读取位置 ,x辅助存数值   
            while (j < s.size() && isdigit(s[j]))
                x = x * 10 + s[j ++ ] - '0';//字符串转数字
            num.push(x);//计算完放入num数字栈
            i = j - 1;//i移动到j : i先移动到j-1, 最后执行i++ == j       
        } //括号特殊,遇到左括号直接入栈,遇到右括号计算括号里面的
        else if (s[i] == '(') op.push(s[i]);//读到左括号无优先级 ,直接放入操作栈op
        else if (s[i] == ')')//读到右括号,运算调用eval函数计算 , 不断弹栈直到左括号结束 ,再弹出左括号
        {
            while (op.top() != '(') eval();
            op.pop();
        }
        else
        {
            while (op.size() && op.top() != '(' && pr[op.top()] >= pr[s[i]]) //op栈还有操作符且不是左括号 && op运算符优先级 >= 读到的操作符
                eval();//弹一个op栈操作符 ,计算    //待入栈运算符优先级低,则先计算
            op.push(s[i]);//操作符入栈
        }
    }

    while (op.size()) eval();//最后运算到没有操作符,得出表达式运算结果由eval存回num栈顶
    cout << num.top() << endl;//调用栈顶

    return 0;
}

标签:考研,运算符,括号,num,eval,求值,数据结构,表达式,op
From: https://blog.51cto.com/u_15623277/6901279

相关文章

  • 数据结构基础
    逻辑结构和物理结构记录一下最近开始学习的数据结构与算法逻辑结构是指数据对象中数据元素之间的相互关系。集合结构集合结构中数据元素,除了都属于一个集合外,无其它关系线性结构数据元素之间是一对一的关系树形结构数据元素之间存在一对多的关系圆形结构数据元素存在多对多的关系物......
  • 37 pinctrl(三)数据结构
    1.pinctrl在devicetree中的定义和使用2.pinctrldriverinit3.常用数据结构pinctrl驱动的注册主要实现函数structpinctrl_dev*pinctrl_register(structpinctrl_desc*pctldesc, structdevice*dev,void*driver_data)从设备树中获取pinctrl_desc,然后将......
  • 408-数据结构算法题笔记
    常用基本操作1.定义整数无穷大#defineINT_MAX=0x7f7f7f7f;2.绝对值函数intabs_(intx){ if(x<0)return-x; returnx;}3.最大最小值函数(一般可以直接写吧)intmin(inta,intb){ if(a<b)returna; returnb;}说明时空间复杂度可以先设neg:代码规范1.函......
  • 考研数据结构——每日一题 [日期]
    3573.日期累加设计一个程序能计算一个日期加上若干天后是什么日期。输入格式第一行包含整数T,表示共有T组测试数据。每组数据占一行,包含四个整数y,m,d,a,分别表示给定日期的年、月、日和累加的天数。输出格式每组数据输出一行,一个结果,每行按yyyy-mm-dd的格式输出。数据......
  • 【数据结构】B树和B+树
    这部分内容较少,B树要理解基本特性,掌握其建立、插入和删除操作;B+树只需要掌握基本概念即可1.B树及其基本操作b树是在平衡二叉树的基础上的衍生概念(1)B树的定义:m阶B树即为所有结点的平衡因子均等于0的m路平衡查找树复习:m叉树指的是结点的最大子树数目,而不是说m叉树的每个非叶结点......
  • 5 线性数据结构 参考代码
    P3156[深基15.例1]询问学号#include<cstdio>constintMAXN=2000005;inta[MAXN];intmain(){intn,m;scanf("%d%d",&n,&m);for(inti=0;i<n;++i)scanf("%d",&a[i]);while(m--){int......
  • 数据结构之带头节点的单链表增删改查操作实现
     单链表的定义什么是单链表   单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素。   单链表的各个数据元素在物理上可以是离散存放的,每个结点除了存放数据元素外,还要存储指向下一个节点的指针。而顺序表是连续存放的,每个结点中只......
  • 数据结构中队列的存储和应用
    队列:只有两个口进出数据,一个专门进入数据,另一个专门出数据,先进先出,FIFO表 一、顺序队列:存储元素的连续内存的首地址容量队头位置(出队)队尾位置(入队)[元素数量]运算:创建、销毁、清空、出队、入队、队空、队满、队头、队尾、元素数量#inclu......
  • 算法学习(一)—— 如何看待数据结构与算法
    绪言最近在通过阅读K神的《Hello算法》学习数据结构与算法的知识,同时做一些博客笔记记录,方便日后的查找和复习算法数据结构与算法统称算法认识算法算法更多的是一种逻辑,例如:查阅字典的原理与二分查找算法相一致。二分查找体现了分而治之的重要算法思想。整理扑克的过......
  • [数据结构笔记] 线性表
    栈栈是一种后进先出(\(\text{LastInFirstOut,LIFO}\))的线性表,顾名思义,后入栈的元素反而先出栈,其限制是只能在一端插入与删除,就像下面这样,只有一端有开口,另一端则是封死的。\[栈顶\large\begin{array}{c|c|c|c|c|c|c|c|{3}{r@{.}l|}}\hline\\text{}0&1&2&3&4&5&6......