首页 > 其他分享 >栈的应用:逆波兰表达式

栈的应用:逆波兰表达式

时间:2024-10-21 19:49:46浏览次数:4  
标签:ch return notation top 波兰 应用 push 表达式 op

#include <iostream>

#include <string>

#include <vector>

#include <stack>

using namespace std;

bool parenthesisMatching(const string &notation);

bool isNum(char ch);

int opPriority(char ch);

double calculate(const string &s);

// reverse Polish notation 逆波兰表达式-中缀转后缀

// 进符号栈条件

/*

1.栈空

2.op优先级更高

3.左括号 (注:右括号不进)

*/

bool reversePolishNotation(const string &notation, string &target)

{

    stack<char> op;

    if (!parenthesisMatching(notation))

        return false;

    for (char ch : notation)

    {

        if (isNum(ch))

            target.push_back(ch);

        else

        {

            if (op.empty() || (!op.empty() && opPriority(ch) > opPriority(op.top())) || ch == '(')

                op.push(ch);

            else if (ch == ')')

            {

                while (op.top() != '(')

                {

                    target.push_back(op.top());

                    op.pop();

                }

                op.pop();

            }

            else

            {

                while (!op.empty() && opPriority(ch) <= opPriority(op.top()))

                {

                    target.push_back(op.top());

                    op.pop();

                }

                op.push(ch);

            }

        }

    }

    while (!op.empty())

    {

        target.push_back(op.top());

        op.pop();

    }

    return true;

}

// parenthesis matching 括号匹配

bool parenthesisMatching(const string &notation)

{

    stack<char> par;

    for (char ch : notation)

    {

        if (ch == '(' || ch == '[' || ch == '{')

            par.push(ch);

        else if (ch == ')' || ch == ']' || ch == '}')

        {

            if (par.empty())

                return false;

            char c = par.top();

            par.pop();

            if ((c == '(' && ch != ')') || (c == '[' && ch != ']') || (c == '{' && ch != '}'))

                return false;

        }

    }

    return par.empty();

}

bool isNum(char ch)

{

    if (ch >= '0' && ch <= '9')

        return true;

    return false;

}

int opPriority(char ch)

{

    if (ch == '+' || ch == '-')

        return 1;

    if (ch == '*' || ch == '/')

        return 2;

    return 0;

}

double calculate(const string &s)

{

    string polish;

    reversePolishNotation(s, polish);

    stack<double> notation;

    for (char ch : polish)

    {

        if(!isNum(ch))

        {

            double x = notation.top()-'0';

            notation.pop();

            double y = notation.top()-'0';

            notation.pop();

            if (ch == '+')

                notation.push(x + y);

            if (ch == '-')

                notation.push(x - y);

            if (ch == '*')

                notation.push(x * y);

            if (ch == '/')

                notation.push(x / y);

        }

        else

        notation.push(ch);

    }

    return notation.top();

}

标签:ch,return,notation,top,波兰,应用,push,表达式,op
From: https://blog.csdn.net/Star_Never/article/details/143115191

相关文章

  • 第六章 元素应用CSS
    6.1使用CSS设置字体样式在学习HTML时,通常也会使用HTML,对文本字体进行一些非常简单的样式设置,而使用CSS对字体样式进行设置远比使用HTML灵活、精确得多。字体样式的常用属性属性说明属性说明font-family设置字体的类型font-welght设置字体的粗细font-size设置字体的......
  • 3D交互营销的应用领域有哪些?
    近年来,随着数字体验经济逐渐成为主流,3D交互式营销凭借其解决产品展示差异性和互动性不足的优势而日益兴盛,帮助产品在众多同类中凸显特色。3D营销正逐步为众多行业开辟新的机遇与挑战,它已广泛应用于电商、汽车、数码家电、家居、时尚、教育、制造及文博等多个领域。1、汽车行......
  • 当coretypes.dll守护者缺席:一键解锁应用程序故障自救秘籍
    在计算机的世界里,每一个小小的文件都承载着巨大的责任。而coretypes.dll,这个看似不起眼的动态链接库文件,却是许多应用程序正常运行的守护神。它负责提供核心类型定义和功能支持,一旦丢失或损坏,你的应用程序可能会立刻陷入困境,出现无法启动、崩溃或功能异常等问题。然而,面对这......
  • Nuxt.js 应用中的 build:before 事件钩子详解
    1.概述build:before 钩子提供了一种方法,让开发者能够在构建即将开始时修改配置或执行特定的前置逻辑。这对配置和文件准备工作尤其有用。2.build:before钩子的详细说明2.1钩子的定义与作用定义: build:before 是Nuxt.js生命周期的一部分,允许开发者在打包......
  • HTTP和HTTPS基本概念,主要区别,应用场景
    HTTP和HTTPS是用于在网络中传输数据的协议,虽然它们的功能类似,但在安全性上存在显著差异。1. HTTP的基本概念定义:HTTP是一种无状态的、面向请求-响应的协议,用于客户端(如浏览器)和服务器之间传输超文本数据(HTML、CSS、JavaScript等)。工作原理:客户端向服务器发送请求,服务器处......
  • 一文搞懂SaaS应用架构:应用服务、应用结构、应用交互设计
    大家好,我是汤师爷~今天系统性地聊聊SaaS应用架构设计。应用架构概述我们已经完成了SaaS系统的定位分析,明确了系统的目标和核心能力。这为接下来的应用架构设计奠定了基础。应用架构就像整个SaaS系统的骨架,决定了系统的整体结构和各个组件之间的关系。接下来,我们会深入探讨应用......
  • HarmonyOS的连接艺术之一:让应用之间无缝协作
    本文旨在深入探讨华为鸿蒙HarmonyOSNext系统(截止目前API12)的技术细节,基于实际开发实践进行总结。主要作为技术分享与交流载体,难免错漏,欢迎各位同仁提出宝贵意见和问题,以便共同进步。本文为原创内容,任何形式的转载必须注明出处及原作者。应用之间协作的需求越来越普遍......
  • ArkWeb页面跳转与跨应用导航 - 高级应用
    本文旨在深入探讨华为鸿蒙HarmonyOSNext系统(截止目前API12)的技术细节,基于实际开发实践进行总结。主要作为技术分享与交流载体,难免错漏,欢迎各位同仁提出宝贵意见和问题,以便共同进步。本文为原创内容,任何形式的转载必须注明出处及原作者。简介页面跳转是Web应用中常见......
  • mongodb 查询条件,查询逻辑对照表,逻辑运算符,正则表达式匹配查询,排序,分页/巧分页,更新操
    mongodb查询条件,查询逻辑对照表,逻辑运算符,正则表达式匹配查询,排序,分页/巧分页,更新操作符,更新单个/多个文档,删除文档,批量插入,$type操作符,内嵌文档和数组查找修改1.条件查询SQLMQLa=1{a:1}a<>1{a:{$ne:1}}a>1{a:{$gt:1}}a>=1{a:{$gte:1}}a<1{a:{$lt......
  • 能源设施安全智能守护:AI监控卫士在油气与电力领域的应用
    能源行业的安全与稳定运行对于社会的可持续发展至关重要,无论是石油、天然气还是电力设施,都面临着复杂的监测需求。思通数科推出的AI视频监控卫士,通过应用先进的人工智能技术,为能源行业的安全监测提供了高效、智能的解决方案。以下将详细介绍系统在油气管道和电力巡检中的具体应用......