首页 文章

为什么堆栈弹出(而不是

提问于
浏览
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 回答

  • 0

    在你的循环中处理到达 ) ,你为每个检查的元素从堆栈中弹出两次(首先在while条件下检查 stack.pop() != '(' 并再次在循环体内抓取 popoff ,所以你将丢失大约一半的字符;因为这是通过在主循环中到达 ) 来触发的,并且因为你忽略了任何不是运算符的东西(所以你的 (a + b) 的堆栈将包含 (+ ,你会在检查 ( 时剥离 + ,这意味着您将 ( 添加到 while 循环体内的后缀中,并在堆栈为空时终止循环 .

    使用peek操作查看堆栈顶部而不实际删除while循环条件中的值来解决该问题,如果在中缀表达式中接受除运算符之外的标记,则需要 else 子句来处理该情况也 .

相关问题