Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用最小括号将后缀(反向波兰符号)表达式转换为中缀_Javascript_Python_Postfix Notation_Infix Notation_Rpn - Fatal编程技术网

Javascript 使用最小括号将后缀(反向波兰符号)表达式转换为中缀

Javascript 使用最小括号将后缀(反向波兰符号)表达式转换为中缀,javascript,python,postfix-notation,infix-notation,rpn,Javascript,Python,Postfix Notation,Infix Notation,Rpn,我正在寻找一种算法,将后缀表达式转换为中缀表达式,但括号最少 在搜索Google Stack Overflow之后,我在这里问这个问题。我只找到了一个问题的答案,但它是用Java语言写的,我不懂那种语言。我正在寻找一个算法,但如果你能给出一个JavaScript或Python(我唯一理解的语言)实现,我将非常感谢你 根据我目前的理解,这就是我能够做到的 const postfixToInfix = RPN => { let convert = RPN.replace(/\^/g,'**

我正在寻找一种算法,将后缀表达式转换为中缀表达式,但括号最少

在搜索Google Stack Overflow之后,我在这里问这个问题。我只找到了一个问题的答案,但它是用Java语言写的,我不懂那种语言。我正在寻找一个算法,但如果你能给出一个JavaScript或Python(我唯一理解的语言)实现,我将非常感谢你

根据我目前的理解,这就是我能够做到的

const postfixToInfix = 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`
}

但是这段代码产生了意想不到的结果。

好的,我自己解决了这个问题。我想我会写下答案供将来使用和其他用户使用。答案基于SO答案中的算法

constpostfix=RPN=>{
让convert=RPN.replace(/\^/g,'**').split(/\s+/g).filter(el=>!/\s+/.test(el)&&el!='')
让堆栈=[]
让结果=[]
设优先级={null:4'**':3'/':2'*':2'+':1'-':1}
convert.forEach(符号=>{
让stra,strb
if(!isNaN(parseFloat(symbol))和&isFinite(symbol)){
结果。推送(符号)
stack.push(空)
}
else if(Object.key(优先级).includes(符号)){
让[a,b,opa,opb]=[result.pop(),result.pop(),stack.pop(),stack.pop()]
if(优先级[opb]<优先级[symbol]){
strb=`(${b})`
}
否则{
strb=`${b}`
}
如果((优先[opa]<优先[symbol])| |((优先[opa]==优先[symbol])&&&[“/”,“-”]包括(symbol))){
stra=`(${a})`
}
否则{
stra=`${a}`
}
结果推送(strb+symbol+stra)
堆栈推送(符号)
}
else throw`${symbol}不是可识别的符号`
})
if(result.length==1)返回result.pop()
else抛出`${RPN}不是正确的RPN`
}

log(postfixToInfix('1 2 3-+4 5-6 7-8+/*'))/(1+2-3)*(4-5)/(6-7+8)
请链接您找到的java帖子。请注意,算法将是相同的。您应该给中缀运算符一个优先级和一个结合性,而不是称这些东西为“朋友”。@bergi No algorithm:(@bergi我没有一个好名字,所以我给它取名为friends,但我称它为variables真的很重要吗当然,你称它为variables很重要,因为这让你的程序员同事,比如你在StackOverflow上问的那些人,以及你未来的自己,都可以阅读和理解代码。