`
爱宝贝丶
  • 浏览: 7416 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

中缀表达式转换为后缀表达式

阅读更多

       在对表达式(中缀表达式)的运算求值的过程中,如果表达式比较复杂,那么对于计算机的内存和运算效率都有很大的浪费,而后缀表达式则没有此类困扰。理论上,后缀表达式可以计算任意复杂的计算式,并且其消耗的空间也只有少量的栈空间,栈中保存的只是转换过程中的运算符。本文则讲述了如何将中缀表达式转换为后缀表达式,实际代码如下:

import java.util.Stack;

public class MiddleToLast {
  public static String transfer(String str) {
    StringBuilder result = new StringBuilder("");
    Stack<Character> stack = new Stack<>();
    for (int i = 0; i < str.length(); i++) {  // 循环判断字符,这里默认输入的字符串是格式规整的表达式
      switch (str.charAt(i)) {
        case ' ':
          continue;
        case '+':
          result.append(plus(stack));
          break;
        case '-':
          result.append(sub(stack));
          break;
        case '*':
          result.append(mul(stack));
          break;
        case '/':
          result.append(div(stack));
          break;
        case '(':
          stack.push('(');
          break;
        case ')':
          result.append(parenthesis(stack));
          break;
        default:
          if (i > 0 && ('0' > str.charAt(i - 1) || str.charAt(i - 1) > '9')) {
            result.append(" ");
          }
          result.append(str.charAt(i));
      }
    }
    while (!stack.isEmpty()) {
      result.append(" " + stack.pop());
    }
    return result.toString();
  }

  // 反括号
  private static String parenthesis(Stack<Character> stack) {
    StringBuilder result = new StringBuilder("");
    while (!stack.isEmpty()) {
      if (stack.peek() == '(') {
        stack.pop();
        break;
      }
      result.append(" " + stack.pop());
    }
    return result.toString();
  }

  // 除号
  private static String div(Stack<Character> stack) {
    StringBuilder result = new StringBuilder("");
    while (!stack.isEmpty() && privilege(stack.peek(), '/')) {
      if (stack.peek() == '(') {
        break;
      }
      result.append(" " + stack.pop());
    }
    stack.push('/');
    return result.toString();
  }

  // 乘号
  private static String mul(Stack<Character> stack) {
    StringBuilder result = new StringBuilder("");
    while (!stack.isEmpty() && privilege(stack.peek(), '*')) {
      if (stack.peek() == '(') {
        break;
      }
      result.append(" " + stack.pop());
    }
    stack.push('*');
    return result.toString();
  }

  // 减号
  private static String sub(Stack<Character> stack) {
    StringBuilder result = new StringBuilder("");
    while (!stack.isEmpty() && privilege(stack.peek(), '-')) {
      if (stack.peek() == '(') {
        break;
      }
      result.append(" " + stack.pop());
    }
    stack.push('-');
    return result.toString();
  }

  // 加好
  private static String plus(Stack<Character> stack) {
    StringBuilder result = new StringBuilder("");
    while (!stack.isEmpty() && privilege(stack.peek(), '+')) {
      if (stack.peek() == '(') {
        break;
      }
      result.append(" " + stack.pop());
    }
    stack.push('+');
    return result.toString();
  }

  // 判断运算符优先级,若ch1大于ch2,则返回真
  private static boolean privilege(char ch1, char ch2) {
    if ((ch1 == '*' || ch1 == '/' || ch1 == '%') || ((ch1 == '+' || ch1 == '-') && (ch2 == '+' || ch2 == '-'))) {
      return true;
    }
    return false;
  }
}

        在中缀表达式转换为后缀表达式的过程中,基本情况有三种:①操作数②操作符③括号。另外还需要考虑的一个问题是操作符的优先级。转换的思路为:当我们遇到操作数时,就将操作数(数字)直接输出,当我们遇到操作符时,就将操作符栈中顶部保存的操作符进行比较,如当前操作符优先级大于栈中操作符,那么就将当前操作压如栈中,如果当前操作符优先级低于栈中操作优先级,则将栈中顶部操作符弹出,并输出,继续比较栈中顶部操作符与当前操作符的优先级顺序,直至栈中没有操作符或栈中操作符的优先级低于当前操作符,再或者栈中操作符为顺括号"(",最后将当前操作符压入栈中。对于括号,如果遇到顺括号,则直接将顺括号放入栈中,继续扫描下一个字符,如果遇到反括号,则依次弹出栈中的操作符直至遇到顺括号为止。

分享到:
评论

相关推荐

    自定义栈中缀表达式转换为后缀表达式并求值

    ### 自定义栈中缀表达式转换为后缀表达式并求值 #### 需求分析与背景 在计算机科学领域,将一个中缀表达式转换为后缀表达式是解决算术表达式求值问题的一种常用方法。通过这种方式可以避免括号带来的优先级问题,...

    基于栈实现的中缀表达式转换为后缀表达式

    这里我们关注的是将中缀表达式转换为后缀表达式,也称为逆波兰表示法(Reverse Polish Notation, RPN)。这个过程是通过使用数据结构栈来完成的,对于理解和编写计算表达式的程序至关重要。下面我们将详细探讨这一...

    将中缀表达式转换为后缀表达式_C++程序

    中缀表达式转换为后缀表达式_C++程序设计 中缀表达式转换为后缀表达式是一个常见的数据结构和算法问题。中缀表达式是一种常见的数学表达式表示形式,例如:a \* (x + y) / (b - x),而后缀表达式是将运算符移到它的...

    中缀表达式转换为后缀表达式,删除堆栈元素

    中缀表达式转换为后缀表达式,删除堆栈元素中缀表达式转换为后缀表达式,删除堆栈元素中缀表达式转换为后缀表达式,删除堆栈元素中缀表达式转换为后缀表达式,删除堆栈元素中缀表达式转换为后缀表达式,删除堆栈元素...

    中缀表达式转换为后缀表达式c++b编程.pdf

    "中缀表达式转换为后缀表达式C++编程" 中缀表达式转换为后缀表达式是计算机科学中的一种重要技术,广泛应用于编译器、解释器和计算器等领域。中缀表达式是一种人类易读的数学表达式形式,而后缀表达式是一种计算机...

    中缀表达式转换成后缀表达式,然后

    将中缀表达式转换为后缀表达式的主要思路如下: 1. **初始化**:创建两个字符串变量,`s1` 用于存储中缀表达式,`s2` 用于存储最终的后缀表达式。 2. **遍历**:从左到右逐个字符扫描中缀表达式中的每个字符。 3. *...

    将中缀表达式转换为后缀表达式并计算.doc

    将中缀表达式转换为后缀表达式并计算 本文档主要讨论如何将中缀表达式转换为后缀表达式,并计算表达式的值。通过使用栈的操作,实现了中缀表达式到后缀表达式的转换,并计算表达式的值。 一、需求分析 在该实验中...

    中缀表达式转换为后缀表达式的一般算法.docx

    中缀表达式转换为后缀表达式是一种常见的算法,用于将中缀表达式转换为后缀表达式,以便于计算机更好地理解和执行。下面将详细介绍这种算法的步骤和原理。 算法步骤 1. 分配两个栈,S1 和 S2。S1 用于临时存储...

    C++栈实现将中缀表达式转换为后缀表达式借鉴.pdf

    C++栈实现将中缀表达式转换为后缀表达式 知识点1:中缀表达式和后缀表达式 中缀表达式是一种常见的数学表达式形式,其中运算符位于操作数之间,如a+b*c。后缀表达式则是将运算符移到操作数后面的形式,如ab*c+。...

    用二叉树实现中缀表达式转换成后缀表达式

    通过这个C++程序,我们可以将中缀表达式“2 + 3 * 4”转换为后缀表达式“2 3 4 * +”,并以这种方式有效地进行计算。这种方法在编译器和解释器的设计中具有广泛的应用,因为它提供了一种高效且易于理解的方式来解析...

    将中缀表达式转换为后缀表达式并求值实验报告

    1. 用户输入中缀表达式,程序将其转换为后缀表达式并输出。 2. 利用后缀表达式计算表达式的值并输出结果。 3. 检查输入的中缀表达式是否合法。 实验内容主要包括以下几个模块: 1. 构建链栈:链栈是一种线性结构,...

    中缀表达式转换为后缀表达式c++b编程.docx

    "中缀表达式转换为后缀表达式的C++实现" 本文主要讨论中缀表达式转换为后缀表达式的C++实现,涵盖设计思想、实验要求、实验环境、主要数据类型、主函数流程图、分析函数流程图、Exchange函数流程图、Add函数流程图...

    栈的应用 括号匹配,计算器,中缀表达式转换为后缀表达式

    3. **中缀表达式转换为后缀表达式**: 中缀表达式是我们通常看到的数学表达式形式,如"2 + 3 * 4"。转换过程需要用到两个栈:一个运算符栈和一个临时结果栈。遍历表达式,遇到数字直接输出,遇到运算符时,若其...

    java堆栈的应用--中缀表达式转换成后缀表达式和计算

    2. **后缀表达式**(也称为逆波兰表示法):在这种表示法中,操作符紧跟在其操作数之后,例如,上述中缀表达式转换成后缀表达式为 `2 3 4 * +`。这种表示法简化了计算过程,因为不需要括号来明确优先级,而是通过...

    将中缀表达式转换为后缀表达式.c

    将中缀表达式转换为后缀表达式.c

    中缀表达式转成后缀表达式并输出计算结果

    用户输入中缀表达式,程序输出后缀表达式并输出计算结果

    将中缀表达式转换为后缀表达式的数学计算问题

    中缀表达式转换为后缀表达式,也称为逆波兰表示法(Reverse Polish Notation, RPN),是解决数学计算问题的一种有效方法。在中缀表达式中,运算符位于其操作数之间,如 `a + b`,而在后缀表达式中,运算符位于其操作...

    数据结构-3期(KC002) 中缀表达式转换为后缀表达式.docx

    这个文档“数据结构-3期(KC002)中缀表达式转换为后缀表达式.docx”主要探讨了如何将常见的数学中缀表达式转换为后缀表达式,也称为逆波兰表示法。这种转换对于计算和解析表达式非常有用,因为它消除了括号的需求,...

    中缀表达式转换为后缀表达式及逆波兰式求值

    在这个程序中,还实现了前缀表达式转换为后缀表达式,前缀表达式与中缀表达式类似,只是运算符位于操作数之前,如 `+ 2 3`。转换过程与中缀转后缀类似,只是在比较运算符优先级时需反向处理。 此外,程序支持了加、...

Global site tag (gtag.js) - Google Analytics