day10栈与队列(一)
2023-12-13 10:09:57
day10
代码随想录
2023.12.12
补一篇之前的博客。关于栈与队列基础知识的。
1. 232用栈实现队列
其实就是用两个栈模拟入队和出队,入队好说,那出队顺序要与入队顺序相同,所以需要两个栈,一进一出,两次顺序反转,不就和开始顺序顺序相同了嘛?
所以出队的核心思想就是以出队栈为主,若里面有值,则直接弹出即可。如果为空,则需要将入队栈的元素全部按顺序转移到出队栈中。然后弹出出队栈头元素即可。
队列为空就是入队栈和出队栈都为空。
class MyQueue {
public:
stack<int> s_In;
stack<int> s_Out;
MyQueue() {
}
void push(int x) {
s_In.push(x);
}
int pop() {
if(s_Out.empty()){
while(!s_In.empty()){
s_Out.push(s_In.top());
s_In.pop();
}
}
int result = s_Out.top();
s_Out.pop();
return result;
}
int peek() {
int result = this->pop();
s_Out.push(result);
return result;
}
bool empty() {
if(s_Out.empty() && s_In.empty())
return true;
return false;
}
};
2. 225用队列实现栈
如果继续用两个队列实现栈,想一想,入栈还是一样,一个队列(记作队列1)入队即可,那么出栈呢,按理就是队列1的队尾元素,但队列只允许头出,因此需要将队列1的除队尾值外其余所有值全部弹出,保存在队列2,中,因此队列2就是备份的作用。为了保持两个队列的性质,成功弹出值后,将队列2赋值给队列1,然后队列2清空,这样就恢复原始了。此时栈为空只是队列1为空。
所以两个队列能模拟栈,但我们能用一个队列模拟栈为什么要用两个呢?因此进阶一下,用一个队列模拟栈。思考一下,关键就是弹出队尾值时需要按顺序保存之前的所有值,之前是将所有元素放在另一个队列中,那为什么不可将所有元素重新入队呢?这样原来队尾元素就变成队头元素,直接弹出就好,剩下的不就是我们想要的吗?
因此,思路不就理清了。接下来写代码:
class MyStack {
public:
queue<int> que;
MyStack() {
}
void push(int x) {
que.push(x);
}
int pop() {
int size = que.size();
size--; //保证剩下一个,就是原本的队尾元素
while(size--){
que.push(que.front());
que.pop();
}
int result = que.front();
que.pop();
return result;
}
int top() {
return que.back();
}
bool empty() {
return que.empty();
}
};
文章来源:https://blog.csdn.net/qq_56913257/article/details/134953597
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!