leetcode-Peeking Iterator-284

给定一个派生类,这个派生类只继承了基类的next()和hasNext()方法,现在要求重写派生类的next(),hasNext()和peek()方法

peek()始终取next指针的后一个元素

分析:

peek()取的是next指针的后一个元素,并且只有next()和hasNext()两个方法可用,容易发现hasNext()对peek()没有用处,所以对peek()的实现只能通过next()

这是不可避免的,但是产生一个问题就是peek()只是取next后面的值,而不应该移动这个指针的

当然虽然有这个问题,但内部的实现肯定要这么做,那怎么保证对外的接口合法呢

用一个标志位isvis,表示是否用了peek

1.isvis=0,说明没有用peek,系统正常,next指针指向正确的位置,以后的操作该怎样就怎样,比如想调用next(),那就调用next(),取得下一个值并移动指针

2.isvis=1,说明用了peek,系统不正常,next指针指向的是正确位置的下一个位置,如果想调用next(),则不能真的调用next(),因为指针其实已经被peek移动过了

那么返回值该怎么办?用缓存,peek移动指针后保存这个值,这时如果调用next(),直接返回缓存里的值

也就是说isvis=1有两层含义:

1.系统不正常,next指针无需移动

2.缓存里的值可用

 1 // Below is the interface for Iterator, which is already defined for you.
 2 // **DO NOT** modify the interface for Iterator.
 3 class Iterator {
 4     struct Data;
 5     Data* data;
 6 public:
 7     Iterator(const vector<int>& nums);
 8     Iterator(const Iterator& iter);
 9     virtual ~Iterator();
10     // Returns the next element in the iteration.
11     int next();
12     // Returns true if the iteration has more elements.
13     bool hasNext() const;
14 };
15 
16 
17 class PeekingIterator : public Iterator {
18 private:
19     int cache;
20     int isvis;
21 public:
22     PeekingIterator(const vector<int>& nums) : Iterator(nums) {
23         // Initialize any member here.
24         // **DO NOT** save a copy of nums and manipulate it directly.
25         // You should only use the Iterator interface methods.
26         isvis=0;
27     }
28 
29     // Returns the next element in the iteration without advancing the iterator.
30     int peek() {
31         if(!isvis){
32             isvis=1;
33             return cache=Iterator::next();
34         }
35         else return cache;
36     }
37 
38     // hasNext() and next() should behave the same as in the Iterator interface.
39     // Override them if needed.
40     int next() {
41         if(!isvis) return Iterator::next();
42         else{
43             isvis=0;
44             return cache;
45         }
46     }
47 
48     bool hasNext() const {
49         if(isvis) return true;
50         return Iterator::hasNext();
51     }
52 };

 

posted @ 2016-09-01 23:15  0_summer  阅读(425)  评论(0编辑  收藏  举报