C++栈的内部实现
文章讲解: 代码随想录
232.用栈实现队列
题目链接/文章讲解/视频讲解: 代码随想录
class MyQueue {
public:
stack<int> stkIn;
stack<int> stkOut;
MyQueue() {
}
void push(int x) {
stkIn.push(x);
}
int pop() {
if (stkOut.empty()) { //out栈空的时候,先将in栈的元素全部push进out栈,这样in栈中的元素的弹出顺序就能反转了
while (!stkIn.empty()) {
stkOut.push(stkIn.top());
stkIn.pop();
}
}
int result = stkOut.top();
stkOut.pop();
return result;
}
int peek() {
int res = this->pop(); // 直接使用已有的pop函数
stkOut.push(res); // 因为pop函数弹出了元素res,所以再添加回去
return res;
}
bool empty() {
return stkIn.empty() && stkOut.empty();
}
};
/**
* Your MyQueue object will be instantiated and called as such:
* MyQueue* obj = new MyQueue();
* obj->push(x);
* int param_2 = obj->pop();
* int param_3 = obj->peek();
* bool param_4 = obj->empty();
*/
这道题通过栈来模拟队列,由于队列是先进先出,栈是后进先出,所以需要两个栈来模拟队列,入队的时候直接将元素送入stkIn栈中即可,出栈时,需要将stkIn中的元素一个一个弹出并送入stkOut中,这样就可以实现stkIn中元素的反转,出栈时也就相当于是后进先出了。
值得注意的是在C++实现的stack中,pop()函数是并没有返回值的,在模拟队列的pop()函数中不能直接returnstkOut.pop(),而应该像代码中写的那样在创建一个变量再返回。
225. 用队列实现栈
题目链接/文章讲解/视频讲解: 代码随想录
class MyStack {
public:
queue<int> que;
MyStack() {
}
void push(int x) {
que.push(x);
}
int pop() {
int size = que.size(); //用来记录队列的大小以便弹出最里面的元素
while (--size) {
que.push(que.front());
que.pop();
}
int result = que.front();
que.pop();
return result;
}
int top() {
return que.back();
}
bool empty() {
if (que.empty())
return true;
return false;
}
};
/**
* Your MyStack object will be instantiated and called as such:
* MyStack* obj = new MyStack();
* obj->push(x);
* int param_2 = obj->pop();
* int param_3 = obj->top();
* bool param_4 = obj->empty();
*/
这道题通过队列来实现栈,不能使用刚才那道题的方法了,因为队列出队再入队,他的顺序是不会发生改变的,实现的思路是在出栈时,先记录队列的长度,然后将第一个之后的元素全部pop,再将他们入队,这样原本最先入队的元素就到了第一个,然后再将其弹出,就完成了模拟栈的出栈。实际上就是将队列第一个元素后的元素调个头,放回第一个元素之前,顺序不变,只将第一个元素弹出了。
值得注意的是在C++实现的queue中,存在front()函数和back()函数,分别指向队列的头和尾,与stack不同。