diff --git a/cpp/2204/220425.cpp b/cpp/2204/220425.cpp new file mode 100644 index 0000000..3ca24fd --- /dev/null +++ b/cpp/2204/220425.cpp @@ -0,0 +1,75 @@ +#include + +/* + * 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 std::vector& 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; +}; + +/** + * 284. Peeking Iterator + * Design an iterator that supports the peek operation on an existing iterator in addition to the hasNext and the next operations. + * + * Implement the PeekingIterator class: + * + * PeekingIterator(Iterator nums) Initializes the object with the given integer iterator iterator. + * int next() Returns the next element in the array and moves the pointer to the next element. + * boolean hasNext() Returns true if there are still elements in the array. + * int peek() Returns the next element in the array without moving the pointer. + * Note: Each language may have a different implementation of the constructor and Iterator, but they all support the int next() and boolean hasNext() functions. + */ + +class PeekingIterator : public Iterator { +private: + int x = 0; + bool isEmpty = false; + +public: + explicit PeekingIterator(const std::vector& 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. + if (!Iterator::hasNext()) + isEmpty = true; + else + this->x = Iterator::next(); + } + + // Returns the next element in the iteration without advancing the iterator. + int peek() const { + return x; + } + + // hasNext() and next() should behave the same as in the Iterator interface. + // Override them if needed. + int next() { + if (this->isEmpty) + return -1; + auto ret = this->x; + + if (Iterator::hasNext()) { + this->x = Iterator::next(); + } else { + this->isEmpty = true; + } + + return ret; + } + + bool hasNext() const { + return !this->isEmpty; + } +}; \ No newline at end of file diff --git a/cpp/2204/CMakeLists.txt b/cpp/2204/CMakeLists.txt index f528297..baa8a41 100644 --- a/cpp/2204/CMakeLists.txt +++ b/cpp/2204/CMakeLists.txt @@ -3,4 +3,4 @@ PROJECT(2204) SET(CMAKE_CXX_STANDARD 23) -ADD_EXECUTABLE(2204 220424-CN.cpp) +ADD_EXECUTABLE(2204 220425.cpp)