码迷,mamicode.com
首页 > 其他好文 > 详细

LeetCode284. 顶端迭代器

时间:2020-09-04 17:41:03      阅读:73      评论:0      收藏:0      [点我收藏+]

标签:only   mic   成员   directly   返回值   迭代器   lazy   变量   def   

技术图片

这题给的类原型里PeekingIterator类公有继承自类Iterator,所以我们可以调用基类的next()和hasNext()方法。

虽然在class Iterator里只对next()和hasNext()方法做了声明,但是实际上类外肯定对这两个方法做了实现,所以我们
是可以直接调用Iterator::next()和Iterator::hasNext()来获取迭代器的下一个元素以及判断是否还存在下一个元素。

我们再来看子类PeekingIterator,这个类里我们要实现peek()、next()、hasNext(),还需要在构造函数里进行初始化。

先看peek(),因为返回值是int类型,是当前遍历到的元素的下一个元素,所以我们在类PeekingIterator里需要有一个int型
的data member - int cur,这里cur并不是我们已经迭代到的元素(而是我们迭代到的元素的下一个元素)。

再看hasNext(),我们需要在每一次迭代判断cur是不是最后一个元素,因此类PeekingIterator里还需要一个布尔变量记录cur
是不是最后一个元素,于是我们再声明一个变量bool isLast。

看一下具体的实现,构造函数里,一开始两个变量cur和isLast都没有初始化,构造函数里将isLast初始化为false。
因为一开始迭代器没指向任何元素,不过好在我们的cur是定义为当前元素的下一个元素,所以如果Iterator::hasNext()为真,
则将Iterator::next()的值赋值给cur,否则,说明没有元素了,把isLast赋值为真。

peek()函数需要返回下一个元素,由于这就是我们cur记录的就是下一个元素,所以直接return cur就可以了。

next()也返回下一个元素,但是调用了next()函数之后迭代器需要向后移动,所以我们用一个变量nextElement记录一下cur,
然后判断Iterator::hasNext()是否为真,如果为真,则cur = Iterator::next(); 否则,isLast = true; 这步是为了将cur
向后移动,返回的还是nextElement。对Iterator::hasNext()做判断的部分就是成员函数next()和成员函数peek()区别的地方。

hasNext()函数是判断当前元素后面是否还有元素,如果cur是最后一个元素,即isLast为true,则hasNext()为假,否则hasNext()为真。
所以这个函数里返回!isLast即可。

代码如下:

/*
 * Below is the interface for Iterator, which is already defined for you.
 * **DO NOT** modify the interface for Iterator.
 *
 *  class Iterator {
 *		struct Data;
 * 		Data* data;
 *		Iterator(const vector<int>& nums);
 * 		Iterator(const Iterator& iter);
 *
 * 		// Returns the next element in the iteration.
 *		int next();
 *
 *		// Returns true if the iteration has more elements.
 *		bool hasNext() const;
 *	};
 */

class PeekingIterator : public Iterator {
public:
    int cur;
    bool isLast;
	PeekingIterator(const vector<int>& nums) : Iterator(nums) {
	    // Initialize any member here.
	    // **DO NOT** save a copy of nums and manipulate it directly.
	    // You should only use the Iterator interface methods.
	    isLast = false;
        if(Iterator::hasNext() == true) {
            cur = Iterator::next();
        } else {
            isLast = true;
        }
	}
	
    // Returns the next element in the iteration without advancing the iterator.
	int peek() {
        return cur;
	}
	
	// hasNext() and next() should behave the same as in the Iterator interface.
	// Override them if needed.
	int next() {
	    if(isLast == true) {
            return -1;
        }
        int nextElement = cur;
        if(Iterator::hasNext() == true) {
            cur = Iterator::next();
        } else {
            isLast = true;
        }
        return nextElement;
	}
	
	bool hasNext() const {
	    return !isLast;
	}
};

LeetCode284. 顶端迭代器

标签:only   mic   成员   directly   返回值   迭代器   lazy   变量   def   

原文地址:https://www.cnblogs.com/linrj/p/13571162.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!