题目:理论基础
文章链接:代码随想录
详解:
栈与队列提供push和pop等等接口,栈元素必须符合先进后出规则,队列元素必须符合先进先出规则,不提供走访功能,也不提供迭代器(iterrator),不像set或者map提供迭代器iterator来遍历所有元素。
栈与队列是以底层容器完成其所有的工作,对外提供统一的接口,底层容器是可插拔的(也就是说我们可以控制使用哪种容器来实现栈与队列的功能),可以是vector,deque(双向队列),list,常使用的SGI STL,如果没有指定底层实现的话,默认是以deque为缺省情况下栈的底层结构
指定vector为栈的底层实现,初始化语句如下:
std::stack<int, std::vector<int> > third; // 使用vector为底层容器的栈
同理,指定list 为起底层实现,初始化queue的语句如下:
std::queue<int, std::list<int>> third; // 定义以list为底层容器的队列
所以STL栈与队列不被归类为容器,而被归类为container adapter( 容器适配器)。
题目:232.用栈实现队列
文章链接:代码随想录
视频链接:LeetCode:232.用栈实现队列
题目链接:力扣题目链接
图释:
// 用栈实现队列
class MyQueue {
public:
stack<int>stIn; // 一个输入栈
stack<int>stOut; // 一个输出栈
//想法:在push数据的时候,只要数据放进输入栈就好,但在pop的时候,
//如果输出栈为空,则把输入栈中的元素全部导入输出栈中,再从输出栈中弹出数据
//如果输出栈不为空,则直接从输出栈中弹出数据
// 判断队列是否为空?如果输入栈与输出栈都为空,则说明队列为空,反之则不为空
MyQueue() {
}
void push(int x) {
stIn.push(x);
}
int pop() {
int temp = peek(); //一定是从输出栈中弹出的
stOut.pop();
return temp;
}
int peek() {
if (stOut.empty()) {
// 输出栈为空
while (stIn.empty() != true) {
// 全部导入
stOut.push(stIn.top());
stIn.pop(); //弹出
}
}
//输出栈不为空
return stOut.top();
}
bool empty() {
return (stIn.empty() && stOut.empty());
}
};
题目:225. 用队列实现栈
文章链接:代码随想录
视频链接:LeetCode:225.用队列实现栈
题目链接:力扣题目链接
图释:
// 用队列实现栈
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();
}
};