Given an Iterator class interface with methods: next() and hasNext(), design and implement a PeekingIterator that support the peek() operation – it essentially peek() at the element that will be returned by the next call to next().
Here is an example. Assume that the iterator is initialized to the beginning of the list: [1, 2, 3].
Call next() gets you 1, the first element in the list.
Now you call peek() and it returns 2, the next element. Calling next() after that still return 2.
You call next() the final time and it returns 3, the last element. Calling hasNext() after that should return false.
s思路:
1. 首先是考察会不会用继承,忘得差不对了。在inherited class里要用base class的方法,可以用domain operator::
2. 用next来实现peek。每次超前一部运算。同时注意把功能集成到next(),每次next()都把peek的元素准备好即可!
//方法1:同时在peek()和next()里操作,甚至涉及到hasNext()
//之前总结的,一个功能最好在一个函数内实现,这就矛盾了
// 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);
virtual ~Iterator();
// Returns the next element in the iteration.
int next();
// Returns true if the iteration has more elements.
bool hasNext() const;
};
class PeekingIterator : public Iterator {
private:
int peeknum;
bool haspeek;
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.
haspeek=0;
}
// Returns the next element in the iteration without advancing the iterator.
int peek() {
if(!haspeek){
peeknum=Iterator::next();
haspeek=1;
}
return peeknum;
}
// hasNext() and next() should behave the same as in the Iterator interface.
// Override them if needed.
int next() {
if(haspeek){
haspeek=0;
return peeknum;
}
else {
haspeek=0;
return Iterator::next();
}
}
bool hasNext() const {
return haspeek||Iterator::hasNext();
}
};
//方法2:除了初始化外,只在next()内操作了。这就满足了“一个功能最好在一个函数内实现”的原则!
class PeekingIterator : public Iterator {
private:
int peeknum;
bool isnext;
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.
isnext=Iterator::hasNext();
if(isnext) peeknum=Iterator::next();
}
// Returns the next element in the iteration without advancing the iterator.
int peek() {
return peeknum;
}
// hasNext() and next() should behave the same as in the Iterator interface.
// Override them if needed.
int next() {
int cur=peeknum;
isnext=Iterator::hasNext();
if(isnext) peeknum=Iterator::next();
return cur;
}
bool hasNext() const {
return isnext;
}
};