队列是一种先进先出(FIFO)的数据结构,而栈是后进先出(LIFO)。这里的关键思路是使用两个栈来模拟队列的操作,从而使得元素的入队和出队操作符合队列的特性。下面是各个函数的具体作用和实现思路:
push(int x)
- 这个函数用于在队列末尾添加一个元素。由于
stIn
用于输入,所以直接将元素x
推入stIn
栈。
pop()
- 这个函数用于移除队列的第一个元素。实现逻辑如下:
- 如果
stOut
栈为空,那么将stIn
栈中的所有元素依次弹出并推入stOut
栈。由于栈是后进先出,当从stIn
转移到stOut
时,元素的顺序将被反转,从而实现了队列的先进先出顺序。 - 弹出并返回
stOut
栈顶元素,这个元素是队列中最先添加的元素。
- 如果
peek()
- 这个函数用于查看队列的第一个元素,但不从队列中移除它。实现步骤如下:
- 调用
pop()
函数弹出队列的第一个元素,并将其存储在res
变量中。 - 立即将
res
再次推回到stOut
栈,因为pop()
实际上已经移除了元素。 - 返回
res
。
- 调用
empty()
- 这个函数用于判断队列是否为空。实现方法是检查两个栈
stIn
和stOut
是否都为空。只有当两个栈都为空时,队列才真正为空。
通过这种方式,MyQueue
类有效地利用两个栈实现了一个队列的基本操作,包括入队(push)、出队(pop)、查看队首元素(peek)以及判断队列是否为空(empty)。
class MyQueue {
public:
stack<int> stIn;
stack<int> stOut;
void push(int x) {
stIn.push(x);
}
int pop() {
if(stOut.empty())
while(!stIn.empty()){
stOut.push(stIn.top());
stIn.pop();
}
int res = stOut.top();
stOut.pop();
return res;
}
int peek() {
int res = this -> pop();
//this 是一个在 C++(以及其他面向对象编程语言中)特殊的关键字
//用于在类的成员函数内部指向调用该函数的对象的指针
//简单来说,this 指针允许类的一个对象访问它自己的成员(变量和函数)
stOut.push(res);
return res;
}
bool empty() {
return stIn.empty() && stOut.empty();
}
};