目录
今天的题目数量和难度,大概是之前和以后最简单的了!
只涉及到栈和队列的基础操作,不涉及算法相关。
STL容器适配器
- 容器适配器本质上还是容器,只不过此容器模板类的实现,利用了大量其它基础容器模板类中已经写好的成员函数。
- STL 提供了 3 种容器适配器,分别为 stack 栈适配器、queue 队列适配器以及 priority_queue 优先权队列适配器。
栈和队列理论基础
- 常用的SGI STL,如果没有指定底层实现的话,栈和队列底层实现缺省情况下,默认是使用deque实现的;
- 栈和队列不允许有遍历行为,不提供迭代器;
stack 容器适配器
queue 容器适配器
232.用栈实现队列
题目链接:232. 用栈实现队列
请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(
push
、pop
、peek
、empty
):实现
MyQueue
类:
void push(int x)
将元素 x 推到队列的末尾int pop()
从队列的开头移除并返回元素int peek()
返回队列开头的元素boolean empty()
如果队列为空,返回true
;否则,返回false
-
思考过程:
使用一个进栈、一个出栈,来模拟队列的行为。
-
力扣代码:
class MyQueue {
public:
// 初始化两个栈
std::stack<int> stIn; // 进栈
std::stack<int> stOut; // 出栈
MyQueue() {
}
// 将元素 x 推到队列的末尾
void push(int x) {
stIn.push(x);
}
// 从队列的开头移除并返回元素
int pop() {
// 当 stOut 为空的时候,从 stIn 里导入全局数据
if (stOut.empty()) {
while (!stIn.empty()) {
stOut.push(stIn.top());
stIn.pop();
}
}
int result = stOut.top();
stOut.pop();
return result;
}
// 队列开头的元素
int peek() {
// 直接使用已有的 pop 函数
int res = this->pop();
stOut.push(res);
return res;
}
bool empty() {
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. 用队列实现栈
题目链接:225. 用队列实现栈
请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(
push
、top
、pop
和empty
)。实现
MyStack
类:
void push(int x)
将元素 x 压入栈顶。int pop()
移除并返回栈顶元素。int top()
返回栈顶元素。boolean empty()
如果栈是空的,返回true
;否则,返回false
。
一个队列:
-
思考过程:
- 使用一个队列实现模拟栈
- 只要将队列头部的元素(除了最后一个元素外) 重新添加到队列尾部,此时再去弹出元素就是栈的顺序了。
-
力扣代码:
class MyStack {
public:
std::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();
}
};
/**
* 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();
*/
两个队列:
-
思考过程:
- 使用两个队列实现模拟栈:
- 首先和用两个栈模拟队列的思路不同的是,队列先进先出的规则,并不会因为将一个队列中的数据导入另一个队列中,而改变;
- 用两个队列que1和que2实现队列的功能,que2其实完全就是一个备份的作用
- 把que1最后面的元素以外的元素都备份到que2,然后弹出最后面的元素,再把其他元素从que2导回que1
-
力扣代码:
class MyStack {
public:
std::queue<int> que1;
std::queue<int> que2;
MyStack() {
}
void push(int x) {
que1.push(x);
}
// 移除并返回栈顶元素
int pop() {
int size = que1.size();
size--;
while (size--) {
que2.push(que1.front()); // 把 que1 的元素备份到 que2
que1.pop();
}
int result = que1.front();
que1.pop();
size = que2.size();
while (size--) {
que1.push(que2.front()); // 再把 que2 的元素恢复到 que1
que2.pop();
}
return result;
}
int top() {
return que1.back();
}
bool empty() {
return que1.empty();
}
};