【问题标题】:Fixed size Stack Java固定大小的堆栈 Java
【发布时间】:2014-03-13 00:07:11
【问题描述】:

我想创建一个固定大小的堆栈并在堆栈已满时截断堆栈。为此,Creating a fixed-size Stack 中已经存在一种方法,但我不想实现一个类。

有可能做这样的事情吗?

Stack<String> stack = new Stack<String>(){
    private static final long serialVersionUID = 1L;
    public String push(String item) {
        if (this.size() == FIXED_SIZE) {
            //truncate()
        }
        return super.push(item);
    }
};

其余的堆栈方法保持不变?

【问题讨论】:

  • 您要截断还是清除?
  • 对不起,截断。我该怎么做?
  • 截断什么?元素没有被添加
  • 一个“固定大小的栈”是一个数组和一个计数器。

标签: java stack


【解决方案1】:

这就是我在documentation 中找到的。我没有使用或测试它。所以我不确定这会如何解决。因为removeElementAt()是继承自Vector类,我希望removeElementAt(0),依然会移除底部的元素。

Stack<String> stack = new Stack<String>(){
    private static final long serialVersionUID = 1L;
    public String push(String item) {
        if (this.size() == FIXED_SIZE) {
            this.removeElementAt(0);
        }
        return super.push(item);
    }
};

我还假设,你所说的截断是删除当前列表中的第一个元素,如果你只是想拒绝新的元素,你可以返回null

【讨论】:

  • 正是这个。谢谢!
【解决方案2】:

这样的事情怎么样:

 Public class TruncatedStack<T> extends FixedStack<T>
 {         
     private static final long serialVersionUID = 1L;
     @Override
     public String push(String item) {
     if (this.top == size) {
        this.top = -1;
     return super.push(item);
    }

 }

【讨论】:

    【解决方案3】:

    在我的脑海中写下了这个(未经测试)。正如在 cmets 中提到的,固定大小的堆栈只是一个带有计数器的数组,用于跟踪顶部。

    public class FixedSizeStack {
      int top, numElements;
      int[] baseArray;
    
      public FixedSizeStack(int maxSize) {
        top = 0;
        numElements = 0;
        baseArray = new int[maxSize];
      }
    
      public void push(int num) {
        baseArray[top] = num;
        top = (top+1) % baseArray.length;
        numElements++;
      }
    
      public int pop(int num) {
        if(numElements == 0) return null;  //or throw exception--you've removed too many elements!
        numElements--;
    
        top = (top == 0) ? (baseArray.length - 1) : (top - 1);
        return baseArray[top];
      }
    }
    

    【讨论】:

      【解决方案4】:

      是的,您几乎完全正确。你只需要做一个this.remove(0) 然后你就完成了。

      Stack<String> stack = new Stack<String>(){
          @Override
          public String push(String item) {
              if (this.size() == FIXED_SIZE) {
                  this.remove(0)
              }
              return super.push(item);
          }
      };
      

      【讨论】:

        猜你喜欢
        • 2011-12-05
        • 2013-06-30
        • 2015-09-04
        • 2015-05-05
        • 2015-12-11
        • 2017-06-24
        • 2014-12-25
        • 1970-01-01
        • 2011-01-07
        相关资源
        最近更新 更多