232.用栈实现队列
不知道怎么动手,不会操作。看讲解。
看完视频,自己动手画图,模拟栈和队列的进出操作,push是进栈和入队,pop是出栈和出队。
class MyQueue {
public:
stack<int> stIn;
stack<int> stOut;
MyQueue() {
}
void push(int x) {
stIn.push(x);
}
int pop() { //将in里面的元素全部入栈到out里面去,再从out里出栈就是模拟出队列
if(stOut.empty()){ //自己写的时候又写掉了这个,只有当out为空的时候才能入栈,不然顺序会乱
while(!stIn.empty()){
stOut.push(stIn.top());
stIn.pop();
}
}
int result = stOut.top();
stOut.pop(); //自己写的时候写掉了这一步,没有将out的第一个元素出栈
return result;
}
int peek() { //注意这里自己没想到
int res = this->pop(); //调用已有函数,pop是从队列开头移除元素并返回元素
stOut.push(res); //调用了pop函数之后出栈了一个元素,再给塞回去
return res; //返回res
}
bool empty() {
//return stOut.empty(); 这样的问题是什么?因为一开始out是空的,但是元素都已经进入队列了,所以要两个栈都空才行
return stIn.empty() && stOut.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();
*/
坑很多。
225. 用队列实现栈
有了第一题的经验,这一题感觉可以动手了。用两个队列来模拟栈,但是可以简化一波,用一个队列就行。
class MyStack {
public:
queue<int> que;
MyStack() {
}
void push(int x) {
que.push(x); //一样push
}
//注意是先把队头的1个元素插入到队尾,再将这1个元素删除,循环做这个操作直至队里剩第n个元素
int pop() { //要把队列前n-1个元素都出队,才能出第n个元素,出队之后再入队
int size = que.size(); //搞一个size记录队列的长度
size--; //记录前n-1个的长度
while(size--){ //注意这个size是逐渐减少的,而不是重新入队之后的长度,即将前n-1个元素重新入队尾
que.push(que.front());
que.pop();
}
int result = que.front(); //此时出栈的就是原始队尾的一个元素
que.pop(); //出栈
return result;
}
int top() {
return que.back(); //栈顶的元素就是队尾的元素
}
bool empty() {
return que.empty(); //栈空就是队空
}
};
/**
* 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();
*/
que.front()是出队的那一边,que.back()是入队的那一边。
这篇博客介绍了如何使用栈实现队列以及如何用队列实现栈。在栈实现队列的方法中,通过两个栈来模拟队列的操作,push操作直接入栈,pop操作则需要先将一个栈的所有元素转移到另一个栈再出栈。而在队列实现栈的方案中,仅使用一个队列,通过将队列头部的元素移到队尾来模拟栈的出栈操作。这两个实现都需要特别注意元素的转移和操作顺序。
400

被折叠的 条评论
为什么被折叠?



