• LeetCode284. 顶端迭代器


    这题给的类原型里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;
    	}
    };
    
  • 相关阅读:
    laravel观察者模式使用及注意事项
    所有CM_消息的说明
    编写Delphi控件属性Stored和Default的理解及应用
    DBGrid上设置选择项
    Enter键使用作Tab键
    delphi 向Windows窗口发送Alt组合键的问题
    DBGridEh用法总结三(PivotGrid的汉化)
    delphi FastReport快速入门
    fastreport打印空白行的方法
    VC对话框如何添加WM_ERASEBKGND消息(OnEraseBkgnd函数)及对话框使用位图背景并透明
  • 原文地址:https://www.cnblogs.com/linrj/p/13571162.html
Copyright © 2020-2023  润新知