目录
今天的两道题不涉及什么算法,主要是练习栈和队列的操作以及底层原理的简单实现。
Leetcode 232.用栈实现队列
题目链接:Leetcode 232.用栈实现队列
题目描述:使用栈实现队列的下列操作:
- push(x) -- 将一个元素放入队列的尾部。
- pop() -- 从队列首部移除元素,并返回移除的元素值。
- peek() -- 返回队列首部的元素。
- empty() -- 返回队列是否为空。
思路:这里的四个函数只有pop()和peek()的操作需要注意,但由于二者实现代码类似,因此这里主要介绍pop()。
首先回忆栈和队列的特征:栈是先进后出,队列是先进先出。也就是说,本题要实现的pop需要弹出栈底元素,并将元素值返回。由于栈只有一个出口,所以要用两个栈分别用于输入和输出来模拟队列。如果我们将一个栈的所有元素重新添加到另一个栈中,第二个栈的栈顶元素就是需要弹出的元素。动画演示看这里
以下是完整代码:
class MyQueue {
public:
//用两个栈模拟队列
stack<int> stIn;
stack<int> stOut;
MyQueue() {}
void push(int x) {
stIn.push(x);
}
int pop() {
if (stOut.empty()) {
while (!stIn.empty()) {
//从stInd导入数据
stOut.push(stIn.top());
stIn.pop();
}
}
int result = stOut.top();
stOut.pop();
return result;
}
int peek() {
int res=this->pop();// 直接使用上面的pop函数
stOut.push(res);//因为pop将元素弹出,这里再加回去
return res;
}
bool empty() {
return stIn.empty() && stOut.empty();
}
};
- 时间复杂度: push和empty为O(1), pop和peek为O(n)
- 空间复杂度: O(n)
Leetcode 225. 用队列实现栈
题目链接:Leetcode 225. 用队列实现栈
题目描述:使用队列实现栈的下列操作:
- push(x) -- 元素 x 入栈。
- pop() -- 移除栈顶元素,并返回移除的元素。
- top() -- 获取栈顶元素。
- empty() -- 返回栈是否为空。
思路:主要介绍pop()的实现。根据栈和队列的特点可知:移除栈顶的元素就是移除队列最后一个元素,尽管C++可以直接获取队列尾部元素,但无法移除,队列只能移除首元素。因此我们可以想到:如果把最后一个元素变成首元素不就行了吗?只需要逐一将尾元素前面的元素先出队再重新入队即可。动画演示看这里
以下是完整代码:
class MyStack {
public:
queue<int> que;
MyStack() {
}
void push(int x) {
que.push(x);
}
int pop() {
int size=que.size()-1;
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();
}
};
- 时间复杂度: pop为O(n),其他为O(1)
- 空间复杂度: O(n)
总结:今天的两道题帮我重新复习了栈和队列的基本操作,代码基础但是重要。
最后,如果文章有错误,请在评论区或私信指出,让我们共同进步!