后缀表达式(逆波兰表达式)转换

简介: 来源:维基百科-后缀表达式目标将中缀表达式转换为后缀表达式,比如((5+2) * (8-3))/4 转换为5 2 + 8 3 - * 4 /.解题思路将表达式的字符逐一处理,如果是数字(变量)则直接输出,如果是字符入栈,并按以下规则进行处理.

来源:

维基百科-后缀表达式

目标

将中缀表达式转换为后缀表达式,比如((5+2) * (8-3))/4 转换为5 2 + 8 3 - * 4 /.

解题思路

将表达式的字符逐一处理,如果是数字(变量)则直接输出,如果是字符入栈,并按以下规则进行处理.

+/-: 低优先级,所以将栈中的所有运算符出栈,之后将自己入栈.

*or/:高优先级,将栈中的其他乘除运算符出栈,之后将自己入栈.

(: 左括号则直接入栈.

): 右括号将栈中运算符逐一出栈,直到遇到左括号.

实现代码

/**
 * solve the N-Queen problem
 */
public class NQueen {

  //the number of chess board,example 8
  private static final int N = 8;

  // result, the result[i] mean: the location of [i] line is on result[i] column.
  private int[] result = new int[N];

  //total num of possible result
  private int resultNum = 0;

  /**
   * calculation
   */
  private void calculation(int n) {

    //if n == N, print the result
    if (n == N) {
      for (int i = 0; i < result.length; i++) {
        System.out.print(result[i] + ",");
      }
      System.out.println();
      resultNum++;
    } else {
      for (int i = 0; i < N; i++) {
        // test every location possible
        result[n] = i;
        //if line n is allowed, locate the next line
        if (isAllowed(n)) {
          calculation(n + 1);
        }
      }
    }
  }

  /**
   * judge current line is allowed or not.
   */
  private boolean isAllowed(int i) {
    // i is not allowed while it in same line or diagonal with the pre line
    for (int j = 0; j < i; j++) {
      if (result[i] == result[j] || Math.abs(i - j) == Math.abs(result[i] - result[j])) {
        return false;
      }
    }
    return true;
  }

  //main method, include some test cases
  public static void main(String[] args) {
    NQueen queen = new NQueen();

    queen.calculation(0);

    System.out.println(queen.resultNum);
  }

}

完。







ChangeLog


2019-02-24 完成



以上皆为个人所思所得,如有错误欢迎评论区指正。

欢迎转载,烦请署名并保留原文链接。

联系邮箱:huyanshi2580@gmail.com

更多学习笔记见个人博客------>呼延十

目录
相关文章
|
3月前
|
存储 算法 C语言
C语言编程—中缀表达式转换为后缀表达式
1.创建栈 2.从左向右顺序获取中缀表达式 a.数字直接输出 b.运算符 情况一:遇到左括号直接入栈,遇到右括号将栈中左括号之后入栈的运算符全部弹栈输出,同时左括号出栈但是不输出。 情况二:遇到乘号和除号直接入栈,直到遇到优先级比它更低的运算符,依次弹栈。 情况三:遇到加号和减号,如果此时栈空,则直接入栈,否则,将栈中优先级高的运算符依次弹栈(注意:加号和减号属于同一个优先级,所以也依次弹栈)直到栈空或则遇到左括号为止,停止弹栈。(因为左括号要匹配右括号时才弹出)。 情况四:获取完后,将栈中剩余的运算符号依次弹栈输出 例:将:2*(9+6/3-5)+4转化为后缀表达式 2 9
40 0
|
2月前
|
存储 算法
计算器——可支持小数的任意四则运算(中缀表达式转为后缀表达式算法)
计算器——可支持小数的任意四则运算(中缀表达式转为后缀表达式算法)
18 1
|
8月前
中缀表达式转后缀表达式(逆波兰式)
中缀表达式转后缀表达式(逆波兰式)
|
9月前
1198:逆波兰表达式
1198:逆波兰表达式
|
9月前
1331:【例1-2】后缀表达式的值
1331:【例1-2】后缀表达式的值
|
9月前
|
算法
中缀表达式转后缀表达式(1、2、3) 2021-03-26
中缀表达式转后缀表达式(1、2、3) 2021-03-26
113 0
中缀表达式转后缀表达式(1、2、3) 2021-03-26
|
10月前
|
存储
中缀表达式转化为后缀表达式
中缀表达式转化为后缀表达式
|
10月前
后缀表达式
后缀表达式
70 0
|
10月前
|
存储 算法
每日一题——逆波兰表达式求值(前缀、中缀、后缀表达式的说明,库函数atoi()的解析)
每日一题——逆波兰表达式求值(前缀、中缀、后缀表达式的说明,库函数atoi()的解析)
|
10月前
|
存储 算法
逆波兰表达式:计算包含括号的四则运算表达式
平时我们进行数学计算使用的常见书写方式就是中缀表达式,即每一个运算符号都位于计算数的中间,如下: (1+2)\3 而这对于计算机进行求取结果来说,并不是一个最优的方案。
71 0