我正在编写一个代码,将中缀转换为后缀,用于hw赋值 . 我调试了它,但我似乎无法解决为什么当它弹出堆栈时它会返回'('而不是'''
StackInterface<Character> stack = new ArrayStack<Character>();
String postfix = "";
int length = infxEx.length();
for(int i =0; i != length; ++i){
char oneChar =infxEx.charAt(i);
if(oneChar == '('){
stack.push(oneChar);
}else
if(oneChar == '*' || oneChar == '/'|| oneChar == '%'|| oneChar == '+' || oneChar == '-'){
stack.push(oneChar);
//error checking input is int
}
else if(oneChar == ')'){
while (stack.pop() != '(' && !stack.empty()){
char popoff = stack.pop();
postfix = postfix + popoff;
}
}
谢谢!
1 回答
在你的循环中处理到达
)
,你为每个检查的元素从堆栈中弹出两次(首先在while条件下检查stack.pop() != '('
并再次在循环体内抓取popoff
,所以你将丢失大约一半的字符;因为这是通过在主循环中到达)
来触发的,并且因为你忽略了任何不是运算符的东西(所以你的(a + b)
的堆栈将包含(+
,你会在检查(
时剥离+
,这意味着您将(
添加到while
循环体内的后缀中,并在堆栈为空时终止循环 .使用peek操作查看堆栈顶部而不实际删除while循环条件中的值来解决该问题,如果在中缀表达式中接受除运算符之外的标记,则需要
else
子句来处理该情况也 .