2016-03-05 143 views
0

我正在编写一个代码,将中缀转换为后缀以进行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

添加允许我们重现问题的输入会很好。 – fabian

+0

该算法不正确。它不处理运算符优先级。您需要查看Dijkstra调车码算法。 – EJP

回答

0

在你的循环处理达到),你从检查(先在while条件堆栈的每个元素弹出两次检查stack.pop() != '(',并再次在循环体内抓取popoff,所以你会失去大约一半的字符;因为这是三在主循环中达到),并且由于您忽略了不是操作员的任何内容(因此您的堆栈(a + b)将包含(+,并且您将在检查(时去掉+,这意味着您将添加(添加到while循环体内的后缀中,并在堆栈为空时终止循环。

使用查看操作看堆栈的顶部,而无需在while循环实际上删除值来解决这个问题,如果你接受比经营其他标记在你的缀表达式,你将需要一个else条款以处理这种情况也。