《LeetCode之每日一题》:169.顶端迭代器

本文介绍了一种通用的PeekingIterator设计,支持在不移动指针的情况下查看并获取整数数组中的下一个元素。通过C++模板方法,该设计可以适应不同类型的元素。实现包括基本的构造、next、peek和hasNext操作,以及进阶部分的泛型拓展。
摘要由CSDN通过智能技术生成

顶端迭代器


题目链接: 顶端迭代器

有关题目

请你设计一个迭代器,除了支持 hasNext 和 next 操作外,还支持 peek 操作。

实现 PeekingIterator 类:

	PeekingIterator(int[] nums) 使用指定整数数组 nums 初始化迭代器。
	int next() 返回数组中的下一个元素,并将指针移动到下个元素处。
	bool hasNext() 如果数组中存在下一个元素,返回 true ;否则,返回 falseint peek() 返回数组中的下一个元素,但 不 移动指针。
示例:

输入:
["PeekingIterator", "next", "peek", "next", "next", "hasNext"]
[[[1, 2, 3]], [], [], [], [], []]
输出:
[null, 1, 2, 2, 3, false]

解释:
PeekingIterator peekingIterator = new PeekingIterator([1, 2, 3]); // [1,2,3]
peekingIterator.next();    // 返回 1 ,指针移动到下一个元素 [1,(2),3],注意函数next函数实现返回值
peekingIterator.peek();    // 返回 2 ,指针未发生移动 [1,(2),3]
peekingIterator.next();    // 返回 2 ,指针移动到下一个元素 [1,2,(3)]
peekingIterator.next();    // 返回 3 ,指针移动到下一个元素 [1,2,3]
peekingIterator.hasNext(); // 返回 False
提示:

1 <= nums.length <= 1000
1 <= nums[i] <= 1000
对 next 和 peek 的调用均有效
next、hasNext 和 peek 最多调用  1000
进阶:你将如何拓展你的设计?使之变得通用化,从而适应所有的类型,而不只是整数型?

题解

法一:迭代器
C++类模板template <class T>
参考官方题解

/*
 * 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;
 *  public:
 *		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:
	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.
	    flag = Iterator::hasNext();
        if (flag)
        {
            nextElement = Iterator::next();
        }
	}
	
    // Returns the next element in the iteration without advancing the iterator.
	int peek() {
        return nextElement;
	}
	
	// hasNext() and next() should behave the same as in the Iterator interface.
	// Override them if needed.
	int next() {
	    int ret = nextElement;
        flag = Iterator::hasNext();
        if (flag)
        {
            nextElement = Iterator::next();
        }
        return ret;
	}
	
	bool hasNext() const {
	    return flag;
	}
private:
    int nextElement;
    bool flag;

};

在这里插入图片描述

进阶:
参考官方题解

拓展顶端迭代器的设计,使其适用于所有类型,不局限于整数
C++可以通过使用泛型的方式拓展设计.
template <class T>
class PeekingIterator : public Iterator<T> {
public:
    PeekingIterator(const vector<T>& nums) : Iterator<T>(nums) {
        flag = Iterator<T>::hasNext();
        if (flag) {
            nextElement = Iterator<T>::next();
        }
    }
    
    T peek() {
        return nextElement;
    }

    T next() {
        T ret = nextElement;
        flag = Iterator<T>::hasNext();
        if (flag) {
            nextElement = Iterator<T>::next();
        }
        return ret;
    }
    
    bool hasNext() const {
        return flag;
    }
private:
    T nextElement;
    bool flag;
};
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值