【问题标题】:Comparing items in a stack比较堆栈中的项目
【发布时间】:2014-03-17 13:31:35
【问题描述】:

我正在尝试比较两个单独的堆栈以查看它们是否相同。我有一个循环遍历每个堆栈中的每个对象并比较两个对象。我想要发生的是,如果它们相等,则继续循环并返回 true。如果它们在任何给定点都不相等,则中断循环并返回 false。这是我写的:

    public boolean isPalindrome (Stack a, Stack b) {
    Object temp1;
    Object temp2;
    boolean answer;

    for (int i = 0; a.size() > 0; i++) {
        temp1 = a.pop();
        temp2 = b.pop();

        if (temp1 != temp2) {
            answer = false;
        }
        else {
            answer = true;
        }

    }
    return answer;

}

我看到发生的事情是我有一个布尔值,并且通过每个循环,布尔值被分配一个取决于对象的值,然后在循环结束时,返回该布尔值的最新状态。无论我将变量初始化为什么,它就像循环一样对它完全没有任何作用。您不能在循环中修改或返回布尔值吗?处理这个实例的更好方法是什么?我已经查看了大量其他类似问题的帖子,但他们中的大多数似乎都在尝试一些不同的广告,我想尽可能忠实于我最初的想法,我只需要知道我做错了什么。任何建议都会有很大帮助。谢谢!

【问题讨论】:

    标签: java stack boolean


    【解决方案1】:

    一旦发现堆栈不相等,您可以return false(这会破坏方法执行)的基本思想。否则return true:

    public boolean isPalindrome (Stack a, Stack b) {
        if (a.size() != b.size()) {
            return false;
        }
    
        while (a.size() > 0) {
    
            if (!a.pop().equals(b.pop())) {
                return false;
            }
    
        }
        return true;
    
    }
    

    【讨论】:

    • 我试过了,即使对象不相等,每次都会返回true
    • @xTopShelfx 好的,我做了一个小修改,再检查一次
    • 嗯,它仍然无法正常工作..我也不知道为什么,因为一切看起来都可以正常运行,但它只是没有在循环中获取 return 语句......而且每一次虽然我会收到一条错误提示“无法访问代码”
    • @xTopShelfx 对我来说很好用,请在此处查看ideone.com/h8qkbg 你的堆栈是否包含原语或对象?
    • 您应该始终通过a.pop().equals(b.pop()) 进行比较!否则,如果它们相等,您将比较两个对象的引用。
    【解决方案2】:
      public boolean isPalindrome (Stack a, Stack b) {
        Object temp1;
        Object temp2;
        boolean answer = true;
    
        for (int i = 0; a.size() > 0; i++) {
            temp1 = a.pop();
            temp2 = b.pop();
    
            if (temp1 != temp2) {
                answer = false;
                break;
            }
    
        }
        return answer;
    
    }
    

    【讨论】:

      【解决方案3】:

      当您发现错误项目时,您需要放置 return 语句 - 否则,您只是返回在循环的最后一次迭代中找到的布尔值。

      public boolean isPalindrome (Stack a, Stack b) {
      Object temp1;
      Object temp2;
      boolean answer;
      
      for (int i = 0; a.size() > 0; i++) {
          temp1 = a.pop();
          temp2 = b.pop();
      
          if (temp1 != temp2) {
              answer = false;
              return answer;
          }
          else {
              answer = true;
          }
      
      }
      return answer;
      

      }

      【讨论】:

      • 我也尝试过使用 return 语句,但它给了我错误,说该方法需要 return 语句。基本上它甚至没有注册循环中有一个布尔值,我已经尝试了多种方式......
      • 在循环之外(以及在任何 if-test 之外)放置一个 return 语句也很重要,以确保函数始终以 return 语句结束。跨度>
      【解决方案4】:

      我的建议:

      public boolean isPalindrome (Stack a, Stack b) {
          if (a.size() != b.size()) return false;
          while (a.size() > 0) {
              if (a.pop() != b.pop()) {
                  return false;
              }
      
          }
          return true;
      
      }
      

      【讨论】:

        【解决方案5】:

        你应该在 answer 设置为 false 之后添加一个 break 语句。没有这个,只有当最后一个项目不相等时才会返回 false。

        快速说明:我还要检查两个堆栈大小不同的情况。

        【讨论】:

        • 哦,哎呀,我确实在那里休息过,我猜我不小心删除了它。堆栈的大小将始终相同,因为我将一个字符串推入堆栈,然后再次返回另一个堆栈以颠倒它的顺序。
        猜你喜欢
        • 2018-08-04
        • 1970-01-01
        • 1970-01-01
        • 2020-01-25
        • 2013-02-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-03-05
        相关资源
        最近更新 更多