在JavaScript中将中缀转换为前缀表示法
(我曾经问过一个类似的问题,但是文档是错误的,所以这是过去问题的正确版本) 请在JavaScript方面帮助我:我正在编写的程序是一个以前缀表示法接收表达式并以中缀表示法输出相同表达式的程序。该计划的理念如下: 如果用户输入+1 2,则预期输出为1+2。所有有效符号均为+、-、*、/、和%。用户可以输入的数字量应该是无限的(例如,如果我输入+++++++++12345678910,程序应该返回1+2+3+4+5+6+7+8+9+10) 有人能帮我填写循环的注释部分吗?如果你认为有更好的方法完全解决这个问题,我愿意在JavaScript中将中缀转换为前缀表示法,javascript,math,prefix,infix-notation,Javascript,Math,Prefix,Infix Notation,(我曾经问过一个类似的问题,但是文档是错误的,所以这是过去问题的正确版本) 请在JavaScript方面帮助我:我正在编写的程序是一个以前缀表示法接收表达式并以中缀表示法输出相同表达式的程序。该计划的理念如下: 如果用户输入+1 2,则预期输出为1+2。所有有效符号均为+、-、*、/、和%。用户可以输入的数字量应该是无限的(例如,如果我输入+++++++++12345678910,程序应该返回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"
函数中缀(输入){
var x=input.split(“”);//拆分每个变量并将其存储在数组中
var输出=[];
var final=“;//将用于存储中缀表达式
对于(变量i=0;i
您的代码大部分都在那里
程序的主要逻辑需要将输入字符串分成两部分(数组)。一个用于符号/操作数
,另一个用于数字。检查x[i]
是否为“+,-,…”将允许我们检查当前符号是否为操作数,这是一个良好的开端。但是,我们不希望将其存储在输出
数组的索引0处。如果您这样做了,那么所有的符号都将以相反的顺序输入(这不是您想要的)。相反,您可以将符号添加到数组的末尾。在下面的代码片段中,我已将所有符号推入操作数
数组
那么,我们如何检查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]
)不是一个符号,那么它必须是一个数字(正如我们在空格上分割的那样)。因此,您可以添加一个else
,并将当前字符推入numbers
数组
循环遍历所有字符后,将有一个操作数数组,按它们在输入字符串中出现的顺序排列,还有一个数字数组,也按它们在输入字符串中出现的顺序排列。最后一步是将操作数
和数字
数组转换为字符串,其中这些数组中的每个元素用空格分隔。最简单的方法是使用.join()
方法,该方法将数组中的每个元素都连接成一个字符串,并按给定的参数分隔每个元素
通过执行所有这些操作,您可以获得所需的输出:
函数中缀(输入){
var x=input.split(“”);//拆分每个字符并将其存储在数组中
变量操作数=[];
var数=[];
变量符号=['+'、'-'、'/'、'*'、'%'];
对于(变量i=0;i log(中缀(“1-2%3+1*4”);//“-%+*12314”
您的问题描述了如何将前缀转换为中缀,但您的代码块似乎想要将中缀转换为前缀。你想要哪一个?是的,我不知道该怎么做,这就是为什么我把它留给其他解决方案的原因。如果你有,请分享!为了清楚起见,程序应该采用中缀形式并输出该表达式的前缀版本。当您说如果用户输入+12,则预期输出为1+2
,您的意思是相反的吗?i、 e.将1+2
转换为+12
。如果是,请更新您的问题。您的函数将'1+4*2+3'
转换为'+*+1 4 2 3'
,计算结果为13
,但中缀符号计算结果为12
。是这样吗?@customcommander嗨,我是以行动为例,而不是技术上正确的形式。OP似乎只是想提取算符,并把它们放在方程的前面。例如,在OPs示例中,他们希望1-2%3+1*4
成为-%+*12314
。这两种方法的计算结果都不同,中缀为3
,前缀为-4