索引混乱Stack LIFO

时间:2016-03-06 18:27:24

标签: java indexing stack lifo

我一直在以http://www.cs.princeton.edu/courses/archive/spr15/cos126/lectures.html作为参考教自己Java。我刚刚讨论了Stack的主题,他们将以下代码作为示例

import edu.princeton.cs.algs4.StdIn;
import edu.princeton.cs.algs4.StdOut;

public class StrawStack
{
    private String[] a;
    private int N=0;

    public StrawStack(int max)
    { a = new String[max];}

    public boolean isEmpty()
    { return (N==0);}

    //push a string on top of the stack
    public void push(String item)
    { a[N++] = item;}

    //return the last string added to the top of the stack 
    // this is what gets printed out in the main method
    public String pop()
    { return a[--N];  }

    public int size()
    { return N;} 

    public static void main(String[] args)
    {
     int max = Integer.parseInt(args[0]);
     StrawStack stack = new StrawStack(max);
     while (!StdIn.isEmpty())
     {
      String item = StdIn.readString();
      if (item.equals("-"))
      { StdOut.print(stack.pop() + " ");}
      else
      { stack.push(item);}
     }
    }
    //StdOut.println();   
}

使用to be or not to – be - - that - - - is作为输入,然后输出为to be not that or be,这是有道理的,因为-使代码打印出最后一个字符串。我的困惑是当a[--N]方法中有pop时,这最终会如何解决。我在纸上写下了to be or not to –部分输入并跟踪了索引。我认为它是这样的:

(a[0] stays default a[1] = to a[2]= be a[3]= or a[4]=not a[5]=to直到它遇到-,然后才会调用{{1} }}。我的困惑是,不知何故,代码调用pop并返回pop而不是a[5] = to,我认为应该是这种情况。因为在它遇到a[4] = not-然后点击N = 5之后,-会被分配N如果我没有弄错(我必须是)< / p>

1 个答案:

答案 0 :(得分:1)

在此代码中,N是下一个空白空间的索引,而不是堆栈中最后插入的String的索引。因此,当执行[ - N]时,这确实首先减少N,但它指向最后插入的项目,&#34;到&#34;。

遇到第一个&#34; - &#34;时,堆栈如下:

a[0] = "to"
a[1] = "be"
a[2] = "or"
a[3] = "not"
a[4] = "to"

且N为5。