c++表达式求值

这篇具有很好参考价值的文章主要介绍了c++表达式求值。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

给定一个表达式,其中运算符仅包含 +,-,,/(加 减 乘 整除),可能包含括号,请你求出表达式的最终值。
注意:
数据保证给定的表达式合法。题目保证符号 - 只作为减号出现,不会作为负号出现,例如,-1+2,(2+2)(-(1+1)+2) 之类表达式均不会出现。题目保表达式中所有数字均为正整数。题目保证表达式在中间计算过程以及结果中,均不超过 231−1。题目中的整除是指向 0 取整,也就是说对于大于 的结果向下取整,例如 5/3=1,对于小于 0 的结果向上取整,例5/(1−4)=−1。
C++和Java中的整除默认是向零取整;Python中的整除//默认向下取整,因此Python的eval()函数中的整除也是向下取整,在本题中不能直接使用。

输入格式
共一行,为给定表达式。

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

数据范围
表达式的长度不超过 105。

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

输出样例:
8文章来源地址https://www.toymoban.com/news/detail-811977.html

#include<iostream>
#include<stack>
#include<unordered_map>
using namespace std;
stack<int> num; //存储操作数
stack<char> op; //存储操作符
void opera()
{
    int a=num.top();num.pop(); //每取出一个操作符或操作数,出栈
    int b=num.top();num.pop();
    char c=op.top();op.pop();
    if(c=='+') num.push(a+b);
    else if(c=='-') num.push(b-a); //注意先出栈的为减数、除数
    else if(c=='*') num.push(a*b);
    else num.push(b/a);
}
int main()
{
    string s;
    cin>>s;
    unordered_map<char,int> option={{'+',1},{'-',1},{'*',2},{'/',2}};
    for(int i=0;i<s.size();i++)
    {
        if(isdigit(s[i]))  //如果是s[i]为数,入栈
        {
            int j=i,x=0;
            while(j<s.size()&&isdigit(s[j]))
                x=x*10+s[j++]-'0';
            num.push(x);
            i=j-1;
        }
        else if(s[i]=='(') op.push(s[i]);
        else if(s[i]==')')
        {
            while(op.top()!='(') opera();
            op.pop();
        }
        else
        {
            while(op.size()&&op.top()!='('&&option[op.top()]>=option[s[i]])
                opera();
            op.push(s[i]);
        }
    }
    while(op.size()) opera();
    cout<<num.top();
    return 0;
}

到了这里,关于c++表达式求值的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【数据结构】12 堆栈应用:表达式求值

    有一个常量表达式的中缀表达式为:5 + 6 / 2 - 3 * 4,其后缀形式表示为: 5 6 2 / + 3 4 × -。后缀表达式的特点是运算符位于两个预算数之后。其前缀表达式为: - + 5 / 6 2 × 3 4。 后缀表达式相比于中缀表达式的求值要容易很多。 从左到右扫描该表达式: (1)遇见运算数5 6 2时不

    2024年02月20日
    浏览(42)
  • c++表达式求值

    给定一个表达式,其中运算符仅包含 +,-, ,/(加 减 乘 整除),可能包含括号,请你求出表达式的最终值。 注意: 数据保证给定的表达式合法。题目保证符号 - 只作为减号出现,不会作为负号出现,例如,-1+2,(2+2) (-(1+1)+2) 之类表达式均不会出现。题目保表达式中所有数字均

    2024年01月21日
    浏览(26)
  • 数据结构课程实验二:运用栈实现表达式求值

    目录 一、实验目的 二、实验内容 三、实验提示  四、实验思路

    2023年04月17日
    浏览(30)
  • 【数据结构】你知道波兰表达式和逆波兰表达式吗?我才知道原来栈在表达式求值中还能这样使用……

    大家好,很高兴又和大家见面啦!!! 在前面的内容中我们详细介绍了栈的第一种应用——在括号匹配问题中的应用,如果还没有阅读过的朋友可以回看前面两篇文章。在今天的内容中我们将介绍栈的另一种应用——在表达式求值中的应用。 表达式相信大家应该不陌生了,

    2024年04月27日
    浏览(27)
  • 数据结构与算法-(7)---栈的应用-(4)后缀表达式求值

    🌈write in front🌈 🧸大家好,我是Aileen🧸.希望你看完之后,能对你有所帮助,不足请指正!共同学习交流. 🆔本文由Aileen_0v0🧸 原创 CSDN首发🐒 如需转载还请通知⚠️ 📝个人主页:Aileen_0v0🧸—CSDN博客 🎁欢迎各位→点赞👍 + 收藏⭐️ + 留言📝​ 📣系列专栏:Aileen_0v0🧸

    2024年02月07日
    浏览(41)
  • 数据结构——基于二叉树的表达式求值算法

    1.输入一个表达式(表达式中的数均小于10的正整数),利用二叉树来表示该表达式,创建表达式数,然后利用二叉树的遍历操作求表达式的值。 2.输入要求:多组数据,每组数据1行,为一个表达式,表达式以“=”结尾。当输入只有一个“=”时,输入结束。 3.输出要求:每组

    2024年02月04日
    浏览(36)
  • 【数据结构】【栈(stack)应用】四则运算表达式求值(带括号)

            先理解原理,再看代码,注意标红字体很重要!结尾附完整测试代码,C语言实现! 更新留言:         本来是侧重演示栈结构的使用,后面评论区发现很多朋友对这个四则运算比较感兴趣,特此做了更新,新增了对负数的运算支持。         若您也有新的想法

    2024年02月08日
    浏览(36)
  • 【leetcode C++】逆波兰表达式求值

    给你一个字符串数组 tokens ,表示一个根据 逆波兰表示法 表示的算术表达式。 请你计算该表达式。返回一个表示表达式值的整数。 注意: 有效的算符为 \\\'+\\\'、\\\'-\\\'、\\\'*\\\' 和 \\\'/\\\' 。 每个操作数(运算对象)都可以是一个整数或者另一个表达式。 两个整数之间的除法总是 向零截断

    2024年03月16日
    浏览(40)
  • C语言-用栈实现表达式求值

    目录 目的描述: 算法的基本思想: 错误点: 完整代码: 1.输入输出 2.栈操作函数包(数组堆栈.h) 3.实现表达式求值函数包(表达式求值.c) 4.测试输出: 算符优先算法要实现的是,根据运算优先关系来对一个表达式求值,假如说要计算: 4+2*3-10/5 运算的顺序例如: 4+ 2*

    2023年04月10日
    浏览(35)
  • 【数据结构】【栈(stack)应用】四则运算表达式求值(支持括号、负数)

            先理解原理,再看代码,注意标红字体很重要!结尾附完整测试代码,C语言实现! 更新留言:         本来是侧重演示栈结构的使用,后面评论区发现很多朋友对这个四则运算比较感兴趣,特此做了更新,新增了对负数的运算支持。         若您也有新的想法

    2024年02月05日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包