From ba3cf0ea2ae362aadf4bb82e18802c6fb7816923 Mon Sep 17 00:00:00 2001 From: Rohit Tanwar Date: Tue, 2 Jan 2018 16:16:47 +0530 Subject: [PATCH] add RPN snippets --- snippets/infixToPostFix.md | 24 ++++++++++++++++++++++++ snippets/postfixToInfix.md | 29 +++++++++++++++++++++++++++++ 2 files changed, 53 insertions(+) create mode 100644 snippets/infixToPostFix.md create mode 100644 snippets/postfixToInfix.md diff --git a/snippets/infixToPostFix.md b/snippets/infixToPostFix.md new file mode 100644 index 000000000..3fd859e37 --- /dev/null +++ b/snippets/infixToPostFix.md @@ -0,0 +1,24 @@ +const infix = expr => { + let rpn = '' + let solve = expr.replace(/\^/g,'**').match(/([0-9]+|[\+\(\)\/\-]|\*+)/g).filter(el => !/\s+/.test(el) && el !== '') + let stack = [] + let precedence = {'**':5,'/':4,'*':4,'+':3,'-':3} + solve.forEach(symbol => { + if(!isNaN(parseFloat(symbol)) && isFinite(symbol)){ + rpn += symbol + ' ' + } + else if (Object.keys(precedence).includes(symbol)) { + while(((precedence[symbol] < precedence[stack[stack.length-1]]) || ((precedence[symbol] == precedence[stack[stack.length-1]]) && symbol !== "**"))&&(stack[stack.length - 1] !== '(')) { + rpn += stack.pop() + ' ' + } + stack.push(symbol) + } + else if(symbol === '('){stack.push(symbol)} + else if(symbol === ')'){while (stack[stack.length - 1] !== '('){rpn += stack.pop() + ' '; if (stack.length === 0){throw `Mismatched parantheses`}} stack.pop()} + else {throw `${symbol} is not a recognized symbol`} + }) + while(stack.length !== 0){ + rpn += stack.pop() + ' ' + } + return rpn +} diff --git a/snippets/postfixToInfix.md b/snippets/postfixToInfix.md new file mode 100644 index 000000000..c54bd44f0 --- /dev/null +++ b/snippets/postfixToInfix.md @@ -0,0 +1,29 @@ +const postFix = RPN => { + let convert = RPN.replace(/\^/g,'**').split(/\s+/g).filter(el => !/\s+/.test(el) && el !== '') + let stack = [] + let result = [] + let friends = {"+" : ["+","-","*","/"],"-":[],"/":["*"],"*":["/","*"],"**":["+","-","*","/"]} + convert.forEach(symbol => { + if(!isNaN(parseFloat(symbol)) && isFinite(symbol)){ + result.push(symbol) + } + else if (Object.keys(friends).includes(symbol)) { + a = result.pop() + b = result.pop() + if(stack.length !==0){ + if(friends[symbol].includes(stack.pop())){ + result.push(`${b} ${symbol} ${a}`) + stack.push(symbol) + } + else{ + result.push(`(${b}) ${symbol} ${a}`) + stack.push(symbol) + } + } + else {result.push(`${b} ${symbol} ${a}`);stack.push(symbol)} + } + else throw `${symbol} is not a recognized symbol` + }) + if(result.length === 1) return result.pop() + else throw `${RPN} is not a correct RPN` +}