在 JavaScript 中将中缀转换为前缀表示法

Converting Infix to prefix notation in JavaScript

(我以前也问过类似的问题,但是文档是错误的,所以这是过去那个问题的正确版本)

请在JavaScript中帮助我:我正在编写的程序是一个以前缀表示法接受表达式并以中缀表示法输出相同表达式的程序。该程序背后的想法如下:

如果用户输入 + 1 2,则预期输出为 1 + 2。所有有效符号为 +、-、*、/ 和 %。用户可以输入的数字数量应该是无限的(例如,如果我输入 + + + + + + + + + 1 2 3 4 5 6 7 8 9 10,程序应该 return 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10).

有人可以帮我填写循环的注释部分吗,如果您认为有更好的方法来完全解决这个问题,我愿意接受!

function infix(input) {
  var x = input.split(''); // splits each variable and stores it in an array
  var output = [];
  var final = " "; // will be used to store our infix expression
  for (var i = 0; i < x.length; i++) {
    //if x[i] is any of the following : "+, -, *, /, or %" , store it in array output at index 0
    //else if x[i] is a number : store it in an index of array output that is >= 1

  }
  for (var j = 0; j < output.length; j++) {
    var final = x[0] + x[j];
  }
  console.log(final);
}

infix("1 + 2 + 3") // should output "+ + 1 2 3"
infix("1 - 2 % 3 + 1 * 4") // should output "- % + * 1 2 3 1 4"

你的代码大部分都在那里。

您程序的主要逻辑需要将您的输入字符串分成两部分(数组)。一个用于符号/operands,另一个用于numbers。检查 x[i] 是否为“+、-、...”将使我们能够检查当前符号是否为操作数,这是一个好的开始。但是,我们不想将它存储在 output 数组的索引 0 处。如果你这样做,那么所有的符号都会以相反的顺序输入(这不是你想要的)。相反,您可以将符号添加到数组的末尾。在下面的代码片段中,我已将所有符号推入 operands 数组。

那么,我们如何检查 x[i] 是否是一个符号呢?一种方法是针对每个符号检查 x[i],如下所示:

if(x[i] === "+" || x[i] === "-" || ... ) {
  operands.push(x[i]); // add the symbol to the end of the array  
}

或者,您可以使用 .includes() 将其写得更干净一些,这样就不需要多个 ||:

var symbols = ['+', '-', '*', '/', '%'];
...
if(symbols.includes(x[i])) {
  operands.push(x[i]); 
}

如果当前字符 (x[i]) 不是一个符号,那么它必须是一个数字(正如我们在 space 上拆分的那样)。因此,您可以添加一个 else,并将当前字符压入 numbers 数组。

循环遍历所有字符后,您将得到一个操作数数组,按照它们在输入字符串中出现的顺序排列,以及一个数字数组,也按照它们在输入字符串中出现的顺序排列.我们的最后一步是将 operandsnumbers 数组转换为字符串,其中这些数组中的每个元素由 space 分隔。最简单的方法是使用 .join() 方法,该方法会将数组中的每个元素连接成一个字符串,并用您提供的参数分隔每个元素。

通过执行所有这些操作,您可以获得所需的输出:

function infix(input) {
  var x = input.split(' '); // splits each character and stores it in an array
  var operands = [];
  var numbers = [];
  var symbols = ['+', '-', '/', '*', '%'];

  for (var i = 0; i < x.length; i++) {
    if(symbols.includes(x[i])) {
      operands.push(x[i]);
    } else {
      numbers.push(x[i]);
    }
  }
  var final = operands.join(' ') +' ' +numbers.join(' ');
  return final;
}

console.log(infix("1 + 2 + 3")); // "+ + 1 2 3"
console.log(infix("1 - 2 % 3 + 1 * 4")); // "- % + * 1 2 3 1 4"

或者,您可以通过使用 .match() 方法获取非数字(或 space)字符和另一个获取数字字符来更简洁地完成此操作:

const infix = input =>
   [...input.match(/[^\d\s]/g), ...input.match(/\d+/g)].join(' ');

console.log(infix("1 + 2 + 3")); // "+ + 1 2 3"
console.log(infix("1 - 2 % 3 + 1 * 4")); // "- % + * 1 2 3 1 4"