Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/334.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
Java 使用两个堆栈的中缀到后缀_Java_Data Structures_Stack_Infix Notation - Fatal编程技术网

Java 使用两个堆栈的中缀到后缀

Java 使用两个堆栈的中缀到后缀,java,data-structures,stack,infix-notation,Java,Data Structures,Stack,Infix Notation,我的评估方法需要帮助。我得到的输出是完全错误的。我的代码是这样做的:输入:(5+3)*3输出:操作数堆栈:[(,5,+3+,),*4*]运算符堆栈:[]输出应该是:操作数堆栈:[5 3+4*]运算符堆栈:[]*注意:空格应该在数字之间 以下是我的评估方法: /** *计算指定的后缀表达式。如果遇到操作数, *它被推送到操作数堆栈上。如果遇到运算符,则两个 *弹出操作数,计算表达式,并返回结果 *推送到操作数堆栈上。 * *后缀表达式的@param expr字符串表示形式 *@给定表达式的返回

我的评估方法需要帮助。我得到的输出是完全错误的。我的代码是这样做的:输入:(5+3)*3输出:操作数堆栈:[(,5,+3+,),*4*]运算符堆栈:[]输出应该是:操作数堆栈:[5 3+4*]运算符堆栈:[]*注意:空格应该在数字之间

以下是我的评估方法:

/**
*计算指定的后缀表达式。如果遇到操作数,
*它被推送到操作数堆栈上。如果遇到运算符,则两个
*弹出操作数,计算表达式,并返回结果
*推送到操作数堆栈上。
* 
*后缀表达式的@param expr字符串表示形式
*@给定表达式的返回值
*/
公共字符串求值(字符串表达式){
//用于保存生成的后缀表达式的变量。
字符串结果;
//一个字符串变量,用于保存用户输入字符串的各个元素。
字符串标记;
//一个解析器要读取用户输入的各个标记,必须用空格分隔标记。
扫描器解析器=新扫描器(expr);
while(parser.hasNext()){
//每次对表达式求值一个标记。
token=parser.next();
//1)操作数是运算符的第一个或第二个操作数。
//如果运算符堆栈为空,或者如果堆栈顶部有左括号,
//操作数是运算符的第一个操作数。将操作数推送到操作数堆栈上。
if(operatorStack.isEmpty()| | operatorStack.peek()等于(“”){
//操作数1
操作数1=令牌;
//将操作数1推送到操作数堆栈上
操作数堆栈.push(操作数1);
}
//1)否则,操作数是运算符的第二个操作数。第一个操作数应位于
//操作数堆栈,运算符应位于运算符堆栈的顶部。弹出
//堆栈中的第一个操作数和运算符,并形成后缀表达式
//表示将运算符应用于其两个操作数。此表达式是一个操作数
//可以对其应用另一个运算符,因此将其推送到操作数堆栈上。
否则{
//操作数2
字符串操作数2=令牌;
//弹出当前运算符和操作数1
操作数1=操作数堆栈.pop();
currentOperator=operatorStack.pop();
//形成结果表达式
结果表达式=(操作数1+“”+操作数2+“”+当前运算符+“”);
//将结果表达式推送到操作数堆栈上
操作数堆栈.push(结果表达式);
}
//2)右括号标记中缀操作数表达式的结束。匹配的左括号
//括号应位于运算符堆栈的顶部,后缀操作数表达式
//与中缀操作数表达式相对应的表达式应位于操作数堆栈的顶部。
//从运算符堆栈中弹出左括号。如果堆栈现在为空,或者如果标记
//堆栈顶部是另一个左括号,即操作数堆栈顶部的操作数
//是运算符的第一个操作数,假定整个中缀表达式的结尾为
//未到达。在本例中,不做任何进一步的操作。否则,后缀表达式
//操作数堆栈顶部是运算符的第二个操作数。
//第一个操作数应该在它的正下方,运算符应该处于启用状态
//运算符堆栈顶部。从堆栈中弹出操作数和运算符,然后形成
//表示将运算符应用于其操作数的后缀表达式。如1所示
//在上面,将此表达式推送到操作数堆栈上。
如果(isRightParen(令牌)){
//弹出左括号
运算符stack.pop();
if(operatorStack.isEmpty()| | operatorStack.peek()等于(“”){
//运算符的第一个操作数
操作数1=操作数堆栈.peek();
} 
否则{
//运算符的第二个操作数
操作数2=操作数堆栈.peek();
//弹出两个操作数
操作数stack.pop();
操作数stack.pop();
//Pop操作员
currentOperator=operatorStack.pop();
//形成结果表达式
结果表达式=(操作数1+“”+操作数2+“”+当前运算符+“”);
//将结果表达式推送到操作数堆栈上
操作数堆栈.push(结果表达式);
}
}
//3)要处理运算符或左括号,只需将其推到运算符堆栈上。
//如果令牌是运算符,则将其推送到运算符堆栈上。
if(等运算符(令牌)){
操作员堆叠推送(令牌);
}
//如果标记是左括号,则将其推送到运算符堆栈上。
else if(isLeftParen(令牌)){
操作员堆叠推送(令牌);
}
}
//返回已完成的后缀结果
结果=(“操作数堆栈:“+operatorStack.toString()”+“+”运算符堆栈:“+operatorStack.toString()”);
返回结果;

}
快速查看一下您的代码,我可以给您以下建议,而无需给出实际答案,因为这似乎是某种课堂项目?看一看EWD的和。这两篇维基百科文章都包含描述如何实现算法的伪代码。
我希望这有帮助,祝你好运

寻求调试帮助的问题(“为什么此代码不工作?”)必须包括。。。复制它所需的最短代码这是最短的snippet。它们都使用运算符的优先级,并且只使用一个堆栈。我想使用两个堆栈分别处理表达式的每个标记,一个用于运算符,一个用于操作数。