ACM算法训练【模拟栈,表达式求值】

简介: 思路输入长度为n的字符串,例如:1+2+3*4*5输出表达式的值,即:63应该用什么数据结构:当然是栈。应该先计算哪一步?实际应该先计算1+2。“表达式求值”问题,两个核心关键点:双栈,一个操作数栈,一个运算符栈;运算符优先级,栈顶运算符和即将入栈的运算符的优先级比较:如果栈顶的运算符优先级低,新运算符直接入栈如果栈顶的运算符优先级高,先出栈计算,新运算符再入栈


1.模拟栈


题目



输入输出样例


输入样例:


10
push 5
query
push 6
pop
query
pop
empty
push 4
query
empty


输出样例:


5
5
YES
4
NO


代码


很简单的题,代码奉上


#include <bits/stdc++.h>
using namespace std;
const int N = 100010;
int arr[N];
int main()
{
    int k = 0,m;
    cin>>m;
    while(m--)
    {
        int a;
        string op;
        cin>>op;
        if(op=="push")
        {
            cin>>a;
            arr[++k]=a;
        }
        else if(op=="pop")
            k--;
        else if(op=="empty")
            if(k==0) printf("YES\n");
            else printf("NO\n");
        else
            printf("%d\n",arr[k]);
    }
    return 0;
}


2.表达式求值



输入样例:


(2+2)*(1+1)


输出样例:


8


思路


输入长度为n的字符串,例如:1+2+3*4*5


输出表达式的值,即:63


应该用什么数据结构:当然是栈。


应该先计算哪一步?实际应该先计算1+2。


“表达式求值”问题,两个核心关键点:


双栈,一个操作数栈,一个运算符栈;

运算符优先级,栈顶运算符和即将入栈的运算符的优先级比较:

如果栈顶的运算符优先级低,新运算符直接入栈

如果栈顶的运算符优先级高,先出栈计算,新运算符再入栈


以1+2+3*4*5举例:


1.一开始,初始化好输入的字符串,以及操作数栈,运算符栈。



2.一步步,扫描字符串,操作数一个个入栈,运算符也入栈。



3.下一个操作符要入栈时,需要先比较优先级。栈内的优先级高,必须先计算,才能入栈。



4.接下来,运算符和操作数才能继续入栈。下一个操作符要入栈时,继续比较与栈顶的优先级。栈内的优先级低,可以直接入栈。



5.字符串继续移动。



6.又要比较优先级了。栈内的优先级高,还是先计算(3*4=12),再入栈。



7.不断入栈,直到字符串扫描完毕。



8.不断出栈,直到得到最终结果3+60=63,算法完成。



代码


#include <bits/stdc++.h>
using namespace std;
stack<int> num;
stack<char> op;
unordered_map<char,int> h{{'+',1},{'-',1},{'*',2},{'/',2}};
void eval()
{
    int a=num.top();
    num.pop();
    int b=num.top();
    num.pop();
    char c=op.top();
    op.pop();
    int res=0;
    if(c=='+') res=b+a;
    if(c=='-') res=b-a;
    if(c=='*') res=b*a;
    if(c=='/') res=b/a;
    num.push(res);
}
int main()
{
    string str;
    cin>>str;
    for(int i=0;i<str.size();i++)
    {
        if(isdigit(str[i]))//数字入栈
        {
            int x=0,j=i;
            while(j<str.size()&&isdigit(str[j]))
            {
                x=x*10+(str[j]-'0');
                j++;
            }
            num.push(x);
            i=j-1;
        }
        else if(str[i]=='(')//左括号无优先级,直接入栈
        {
            op.push(str[i]);
        }
        //括号特殊,遇到左括号直接入栈,遇到右括号计算括号里面的
        else if(str[i]==')')
        {
            while(op.top()!='(')
                eval();
            op.pop(); //删除左括号
        }
        else
        {
            //待入栈运算符优先级低,则先计算
            while(op.size()&&h[op.top()]>=h[str[i]])
                eval();
            op.push(str[i]);
        }
    }
    while(op.size()) eval();//剩余的进行计算
    cout<<num.top();
    return 0;
}
目录
相关文章
|
9天前
|
算法
【算法】栈
栈相关算法题,供参考,附有链接地址及板书
|
3月前
|
缓存 算法 Java
JVM知识体系学习六:JVM垃圾是什么、GC常用垃圾清除算法、堆内存逻辑分区、栈上分配、对象何时进入老年代、有关老年代新生代的两个问题、常见的垃圾回收器、CMS
这篇文章详细介绍了Java虚拟机(JVM)中的垃圾回收机制,包括垃圾的定义、垃圾回收算法、堆内存的逻辑分区、对象的内存分配和回收过程,以及不同垃圾回收器的工作原理和参数设置。
107 4
JVM知识体系学习六:JVM垃圾是什么、GC常用垃圾清除算法、堆内存逻辑分区、栈上分配、对象何时进入老年代、有关老年代新生代的两个问题、常见的垃圾回收器、CMS
|
3月前
|
存储 机器学习/深度学习 算法
蓝桥杯练习题(三):Python组之算法训练提高综合五十题
蓝桥杯Python编程练习题的集合,涵盖了从基础到提高的多个算法题目及其解答。
134 3
蓝桥杯练习题(三):Python组之算法训练提高综合五十题
|
3月前
|
算法 程序员 索引
数据结构与算法学习七:栈、数组模拟栈、单链表模拟栈、栈应用实例 实现 综合计算器
栈的基本概念、应用场景以及如何使用数组和单链表模拟栈,并展示了如何利用栈和中缀表达式实现一个综合计算器。
54 1
数据结构与算法学习七:栈、数组模拟栈、单链表模拟栈、栈应用实例 实现 综合计算器
|
2月前
|
分布式计算 Java 开发工具
阿里云MaxCompute-XGBoost on Spark 极限梯度提升算法的分布式训练与模型持久化oss的实现与代码浅析
本文介绍了XGBoost在MaxCompute+OSS架构下模型持久化遇到的问题及其解决方案。首先简要介绍了XGBoost的特点和应用场景,随后详细描述了客户在将XGBoost on Spark任务从HDFS迁移到OSS时遇到的异常情况。通过分析异常堆栈和源代码,发现使用的`nativeBooster.saveModel`方法不支持OSS路径,而使用`write.overwrite().save`方法则能成功保存模型。最后提供了完整的Scala代码示例、Maven配置和提交命令,帮助用户顺利迁移模型存储路径。
|
2月前
|
算法 安全 NoSQL
2024重生之回溯数据结构与算法系列学习之栈和队列精题汇总(10)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
数据结构王道第3章之IKUN和I原达人之数据结构与算法系列学习栈与队列精题详解、数据结构、C++、排序算法、java、动态规划你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!
|
3月前
|
机器学习/深度学习 算法 决策智能
【机器学习】揭秘深度学习优化算法:加速训练与提升性能
【机器学习】揭秘深度学习优化算法:加速训练与提升性能
|
3月前
|
算法
数据结构与算法二:栈、前缀、中缀、后缀表达式、中缀表达式转换为后缀表达式
这篇文章讲解了栈的基本概念及其应用,并详细介绍了中缀表达式转换为后缀表达式的算法和实现步骤。
72 3
|
3月前
|
算法 Java C++
【贪心算法】算法训练 ALGO-1003 礼物(C/C++)
【贪心算法】算法训练 ALGO-1003 礼物(C/C++)
【贪心算法】算法训练 ALGO-1003 礼物(C/C++)
|
3月前
|
算法 C++
【算法单调栈】 矩形牛棚(C/C++)
【算法单调栈】 矩形牛棚(C/C++)

热门文章

最新文章