热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

后缀到前缀的转换

后缀到前缀的转换原文:https://www.geeksforg

后缀到前缀的转换

原文:https://www.geeksforgeeks.org/postfix-prefix-conversion/

后缀:如果运算子出现在运算子之后的表达式中,则该表达式称为后缀表达式。简单的形式(operand1 operand2 运算符)。
例: AB+CD-*(中缀:(A+B) * (C-D))

前缀:如果运算子出现在运算对象之前的表达式中,则该表达式称为前缀表达式。简单的形式(操作符 1 操作符 2)。
例: *+AB-CD(中缀:(A+B) * (C-D) )
给定一个后缀表达式,将其转换为前缀表达式。
将后缀表达式直接转换为前缀,而不经过先转换为中缀再转换为前缀的过程,在计算和更好地理解表达式方面要好得多(计算机使用后缀表达式进行评估)。

示例:

Input : Postfix : AB+CD-*
Output : Prefix : *+AB-CD
Explanation : Postfix to Infix : (A+B) * (C-D)
Infix to Prefix : *+AB-CD
Input : Postfix : ABC/-AK/L-*
Output : Prefix : *-A/BC-/AKL
Explanation : Postfix to Infix : ((A-(B/C))*((A/K)-L))
Infix to Prefix : *-A/BC-/AKL

后缀加前缀的算法 :



  • Read suffix expressions from left to right

  • If the symbol is an operand, it is pushed onto the stack.

  • If the symbol is an operator, two operands
    pop up from the stack to create a string by connecting the two operands with the operator in front of them.
    String = operator+operator 2+operator 1
    and push the result string back to the stack.

  • Repeat the above steps until the suffix expression ends.


下面是上述想法的实现:

C++

// CPP Program to convert postfix to prefix
#include
using namespace std;
// function to check if character is operator or not
bool isOperator(char x)
{
    switch (x) {
    case '+':
    case '-':
    case '/':
    case '*':
        return true;
    }
    return false;
}
// Convert postfix to Prefix expression
string postToPre(string post_exp)
{
    stack s;
    // length of expression
    int length = post_exp.size();
    // reading from right to left
    for (int i = 0; i         // check if symbol is operator
        if (isOperator(post_exp[i])) {
            // pop two operands from stack
            string op1 = s.top();
            s.pop();
            string op2 = s.top();
            s.pop();
            // concat the operands and operator
            string temp = post_exp[i] + op2 + op1;
            // Push string temp back to stack
            s.push(temp);
        }
        // if symbol is an operand
        else {
            // push the operand to the stack
            s.push(string(1, post_exp[i]));
        }
    }
    string ans = "";
    while (!s.empty()) {
        ans += s.top();
        s.pop();
    }
    return ans;
}
// Driver Code
int main()
{
    string post_exp = "ABC/-AK/L-*";
    // Function call
    cout <<"Prefix : " <    return 0;
}

Java 语言(一种计算机语言,尤用于创建网站)

// Java Program to convert postfix to prefix
import java.util.*;
class GFG {
    // function to check if character
    // is operator or not
    static boolean isOperator(char x)
    {
        switch (x) {
        case '+':
        case '-':
        case '/':
        case '*':
            return true;
        }
        return false;
    }
    // Convert postfix to Prefix expression
    static String postToPre(String post_exp)
    {
        Stack s = new Stack();
        // length of expression
        int length = post_exp.length();
        // reading from right to left
        for (int i = 0; i             // check if symbol is operator
            if (isOperator(post_exp.charAt(i))) {
                // pop two operands from stack
                String op1 = s.peek();
                s.pop();
                String op2 = s.peek();
                s.pop();
                // concat the operands and operator
                String temp
                    = post_exp.charAt(i) + op2 + op1;
                // Push String temp back to stack
                s.push(temp);
            }
            // if symbol is an operand
            else {
                // push the operand to the stack
                s.push(post_exp.charAt(i) + "");
            }
        }
        // concatenate all strings in stack and return the
        // answer
        String ans = "";
        for (String i : s)
            ans += i;
        return ans;
    }
    // Driver Code
    public static void main(String args[])
    {
        String post_exp = "ABC/-AK/L-*";
        // Function call
        System.out.println("Prefix : "
                           + postToPre(post_exp));
    }
}
// This code is contributed by Arnab Kundu

Python 3

# Python3 Program to convert postfix to prefix
# function to check if
# character is operator or not
def isOperator(x):
    if x == "+":
        return True
    if x == "-":
        return True
    if x == "/":
        return True
    if x == "*":
        return True
    return False
# Convert postfix to Prefix expression
def postToPre(post_exp):
    s = []
    # length of expression
    length = len(post_exp)
    # reading from right to left
    for i in range(length):
        # check if symbol is operator
        if (isOperator(post_exp[i])):
            # pop two operands from stack
            op1 = s[-1]
            s.pop()
            op2 = s[-1]
            s.pop()
            # concat the operands and operator
            temp = post_exp[i] + op2 + op1
            # Push string temp back to stack
            s.append(temp)
        # if symbol is an operand
        else:
            # push the operand to the stack
            s.append(post_exp[i])
    ans = ""
    for i in s:
        ans += i
    return ans
# Driver Code
if __name__ == "__main__":
    post_exp = "AB+CD-"
    # Function call
    print("Prefix : ", postToPre(post_exp))
# This code is contributed by AnkitRai01

C

// C# Program to convert postfix to prefix
using System;
using System.Collections;
class GFG {
    // function to check if character
    // is operator or not
    static Boolean isOperator(char x)
    {
        switch (x) {
        case '+':
        case '-':
        case '/':
        case '*':
            return true;
        }
        return false;
    }
    // Convert postfix to Prefix expression
    static String postToPre(String post_exp)
    {
        Stack s = new Stack();
        // length of expression
        int length = post_exp.Length;
        // reading from right to left
        for (int i = 0; i             // check if symbol is operator
            if (isOperator(post_exp[i])) {
                // Pop two operands from stack
                String op1 = (String)s.Peek();
                s.Pop();
                String op2 = (String)s.Peek();
                s.Pop();
                // concat the operands and operator
                String temp = post_exp[i] + op2 + op1;
                // Push String temp back to stack
                s.Push(temp);
            }
            // if symbol is an operand
            else {
                // Push the operand to the stack
                s.Push(post_exp[i] + "");
            }
        }
        String ans = "";
        while (s.Count > 0)
            ans += s.Pop();
        return ans;
    }
    // Driver Code
    public static void Main(String[] args)
    {
        String post_exp = "ABC/-AK/L-*";
        // Function call
        Console.WriteLine("Prefix : "
                          + postToPre(post_exp));
    }
}
// This code is contributed by Arnab Kundu

java 描述语言


Output

Prefix : *-A/BC-/AKL

推荐阅读
  • 在处理 XML 数据时,如果需要解析 `` 标签的内容,可以采用 Pull 解析方法。Pull 解析是一种高效的 XML 解析方式,适用于流式数据处理。具体实现中,可以通过 Java 的 `XmlPullParser` 或其他类似的库来逐步读取和解析 XML 文档中的 `` 元素。这样不仅能够提高解析效率,还能减少内存占用。本文将详细介绍如何使用 Pull 解析方法来提取 `` 标签的内容,并提供一个示例代码,帮助开发者快速解决问题。 ... [详细]
  • Java Socket 关键参数详解与优化建议
    Java Socket 的 API 虽然被广泛使用,但其关键参数的用途却鲜为人知。本文详细解析了 Java Socket 中的重要参数,如 backlog 参数,它用于控制服务器等待连接请求的队列长度。此外,还探讨了其他参数如 SO_TIMEOUT、SO_REUSEADDR 等的配置方法及其对性能的影响,并提供了优化建议,帮助开发者提升网络通信的稳定性和效率。 ... [详细]
  • 深入剖析Java中SimpleDateFormat在多线程环境下的潜在风险与解决方案
    深入剖析Java中SimpleDateFormat在多线程环境下的潜在风险与解决方案 ... [详细]
  • 本文将继续探讨 JavaScript 函数式编程的高级技巧及其实际应用。通过一个具体的寻路算法示例,我们将深入分析如何利用函数式编程的思想解决复杂问题。示例中,节点之间的连线代表路径,连线上的数字表示两点间的距离。我们将详细讲解如何通过递归和高阶函数等技术实现高效的寻路算法。 ... [详细]
  • 2018 HDU 多校联合第五场 G题:Glad You Game(线段树优化解法)
    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6356在《Glad You Game》中,Steve 面临一个复杂的区间操作问题。该题可以通过线段树进行高效优化。具体来说,线段树能够快速处理区间更新和查询操作,从而大大提高了算法的效率。本文详细介绍了线段树的构建和维护方法,并给出了具体的代码实现,帮助读者更好地理解和应用这一数据结构。 ... [详细]
  • 深入理解排序算法:集合 1(编程语言中的高效排序工具) ... [详细]
  • 本指南从零开始介绍Scala编程语言的基础知识,重点讲解了Scala解释器REPL(读取-求值-打印-循环)的使用方法。REPL是Scala开发中的重要工具,能够帮助初学者快速理解和实践Scala的基本语法和特性。通过详细的示例和练习,读者将能够熟练掌握Scala的基础概念和编程技巧。 ... [详细]
  • 在对WordPress Duplicator插件0.4.4版本的安全评估中,发现其存在跨站脚本(XSS)攻击漏洞。此漏洞可能被利用进行恶意操作,建议用户及时更新至最新版本以确保系统安全。测试方法仅限于安全研究和教学目的,使用时需自行承担风险。漏洞编号:HTB23162。 ... [详细]
  • 优化后的标题:深入探讨网关安全:将微服务升级为OAuth2资源服务器的最佳实践
    本文深入探讨了如何将微服务升级为OAuth2资源服务器,以订单服务为例,详细介绍了在POM文件中添加 `spring-cloud-starter-oauth2` 依赖,并配置Spring Security以实现对微服务的保护。通过这一过程,不仅增强了系统的安全性,还提高了资源访问的可控性和灵活性。文章还讨论了最佳实践,包括如何配置OAuth2客户端和资源服务器,以及如何处理常见的安全问题和错误。 ... [详细]
  • 在安装 iOS 开发所需的 CocoaPods 时,用户可能会遇到多种问题。其中一个常见问题是,在执行 `pod setup` 命令后,系统无法连接到 GitHub 以更新 CocoaPods/Specs 仓库。这可能是由于网络连接不稳定、GitHub 服务器暂时不可用或本地配置错误等原因导致。为解决此问题,建议检查网络连接、确保 GitHub API 限制未被触发,并验证本地配置文件是否正确。 ... [详细]
  • PHP预处理常量详解:如何定义与使用常量 ... [详细]
  • 本文探讨了使用JavaScript在不同页面间传递参数的技术方法。具体而言,从a.html页面跳转至b.html时,如何携带参数并使b.html替代当前页面显示,而非新开窗口。文中详细介绍了实现这一功能的代码及注释,帮助开发者更好地理解和应用该技术。 ... [详细]
  • 解题心得:UVA1339(逻辑分析与字符串处理+排序算法)
    解题心得:UVA1339(逻辑分析与字符串处理+排序算法) ... [详细]
  • 在Android应用开发中,实现与MySQL数据库的连接是一项重要的技术任务。本文详细介绍了Android连接MySQL数据库的操作流程和技术要点。首先,Android平台提供了SQLiteOpenHelper类作为数据库辅助工具,用于创建或打开数据库。开发者可以通过继承并扩展该类,实现对数据库的初始化和版本管理。此外,文章还探讨了使用第三方库如Retrofit或Volley进行网络请求,以及如何通过JSON格式交换数据,确保与MySQL服务器的高效通信。 ... [详细]
  • 每日前端实战:148# 视频教程展示纯 CSS 实现按钮两侧滑入装饰元素的悬停效果
    通过点击页面右侧的“预览”按钮,您可以直接在当前页面查看效果,或点击链接进入全屏预览模式。该视频教程展示了如何使用纯 CSS 实现按钮两侧滑入装饰元素的悬停效果。视频内容具有互动性,观众可以实时调整代码并观察变化。访问以下链接体验完整效果:https://codepen.io/comehope/pen/yRyOZr。 ... [详细]
author-avatar
念念念念念子-璃_908
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有