文档讲解:
225.用队列实现栈
题目链接:https://leetcode.cn/problems/implement-stack-using-queues/submissions/493416480/
思路:
首先我们朴素的能想到用两个队列实现栈,但其实一个队列也能实现。
push操作我们直接将值加入队列即可。
pop操作我们将队尾前的所有元素全部弹出重新加到队尾,那么原本的队尾就成了队头,即栈顶,取值弹出即可。
top操作与pop逻辑相同。
empty与队列的empty相同,队列空则栈空。
核心代码:
class MyStack {
private:
queue<int> que;
public:
MyStack() {
while(!que.empty()) que.pop();
}
void push(int x) {
que.push(x);
}
int pop() {
int n=que.size();
n--;
while(n--){
que.push(que.front());
que.pop();
}
int ans=que.front();
que.pop();
return ans;
}
int top() {
int ans=pop();
push(ans);
return ans;
}
bool empty() {
return que.empty()?true: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();
*/
232.用栈实现队列
题目链接:https://leetcode.cn/problems/implement-queue-using-stacks/description/
思路:
我们用两个栈即可实现队列。其中一个栈作为主体,一个栈作为中转。
push操作我们就将值加入栈即可。
pop操作需要弹出队头元素也即栈底元素。那我们就将栈里的元素挨个弹出来,放到另一个栈里作为中转,直到栈底停止。然后我们取出栈底元素弹出,再把中转栈里的元素加回主体栈即可。
top与pop逻辑相同,区别是不弹主体栈栈底元素,只查看值。
empty与主体栈empty相同,如果栈空则说明队列空。
核心代码:
class MyQueue {
private:
stack<int> stl;
stack<int> str;
public:
MyQueue() {
}
void push(int x) {
str.push(x);
}
int pop() {
while(!str.empty()){
stl.push(str.top());
str.pop();
}
int ans=stl.top();
stl.pop();
while(!stl.empty()){
str.push(stl.top());
stl.pop();
}
return ans;
}
int peek() {
while(!str.empty()){
stl.push(str.top());
str.pop();
}
int ans=stl.top();
while(!stl.empty()){
str.push(stl.top());
stl.pop();
}
return ans;
}
bool empty() {
if(str.empty()) return true;
else return false;
}
};
/**
* 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();
*/
今日总结
今日学习时长2h,因为以前系统的学习过数据结构和算法,队列和栈又是比较基础的数据结构,因此做起来很简单。
依旧要复习周末期末考试。