Search code examples
javascriptmathexpressionprefixinfix-notation

Converting prefix to infix in JavaScript


I am trying to write a program that takes in an prefix expression and outputs an infix expression. I have examples listed below to help demonstrate what I am talking about. I have pasted my code below, could someone please help me figure out how I can move the symbol between 2 numbers in an expression? Please see example 1 to see my approach on how I tried to get it, but it doesn't work. Any answers would be helpful or tips as to what to do. Thank you for your help!

/* The goal is to take in an expression in prefix notation and output it in infix notation
for example:
 + 1 2 outputs output 1 + 2
 + - 3 4 5 outputs 3 + 4 - 5
 % + / - 0 9 3 8 5 outputs 0 % 9 + 3 / 8 - 5 
*/

function convert(input){
  var x = input.split(''); // splits each variable and stores it in an array
  var output = "";
  // these are the valid symbols we can take, we will use these later
  var symbols = ['+', '-', '*', '/', '%'];
  // lets loop through all the values in x, starting at position 0
  for(var i = 0; i < x.length; i++){
    if(symbols.includes(x[i])) { // we hit a symbol, lets move it between 2 numbers
      /* now we need to figure out where to store the symbol. every 2 spaces starting at index 0
       we can insert a symbol (so spots like 1 3 5 7 etc). this loop will help us figure out what spot is empty
       , and it will store the symbol at that spot [see example 1 for a visualizaton]*/
      for(var j = 0; j < input.length; j+=2){
        if(output[j] == " "){
         // great, we can save the symbol here 
          output = output + x[i];
        }
      }
    }
    // otherwise we have a number on our hands
    else{
      output = output + x[i];
      console.log(output);
    }
  }
}

console.log(convert("+ 1 2"));

/*
example 1

if I have "+ 1 2"

+ is position 0
1 is position 2
2 is position 4

so the whitespace is at position 1 and 3. these are the spots where we can output the symbols
using the original expression + 1 2

position:  value:
-------- | ------
0        |    1
-------- | ------
1        |   " "
-------- | ------
2        |    +
-------- | ------
3        |   " "
-------- | ------
4        |    2

*/

Solution

  • So long as you're only using simple expressions, I would suggest dividing the input into two arrays, numbers and symbols, and then merging them together.

    var symbols = ['+', '-', '*', '/', '%'];
    
    function convert(input) {
      var
        response = '',
        infixes = [],
        numbers = [];
    
      // Divide input into two arrays, infixes (or symbols) and numbers
      infixes = input.split(' ').filter(function(o) {
        if (symbols.includes(o)) {
          return true;
        } else {
          numbers.push(o);
        }
      });
    
      // Merge arrays
      for (let i = 0; i < numbers.length; i++) {
        if (infixes[i]) {
          response =
            response +
            numbers[i] + ' ' +
            infixes[i] + ' ';
        } else {
          response =
            response + numbers[i] + ' ';
        }
      }
    
      response = response.slice(0, -1);
    
      return response;
    };
    

    This function works for all your examples, but if you need to make it more intelligent you can easily modify and test the above function on codepen here.