提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
今天是跟着代码随想录刷题的第10天,今天主要学了以下内容:栈和列表的理论知识、用队列实现栈以及用栈实现队列。
链接地址:栈与队列的内部实现机制、用栈实现队列、用队列实现栈
一、栈和队列的理论知识
栈的内部结构,栈的底层实现可以是vector,deque,list 都是可以的, 主要就是数组和链表的底层实现。
我们也可以指定vector为栈的底层实现,初始化语句如下:
std::stack<int, std::vector<int> > third; // 使用vector为底层容器的栈
也可以指定list 为起底层实现,初始化queue的语句如下:
std::queue<int, std::list<int>> third; // 定义以list为底层容器的队列
总结:栈先进后出,队列先进先出
二、用栈实现队列
使用栈实现队列的下列操作:
push(x) – 将一个元素放入队列的尾部。
pop() – 从队列首部移除元素。
peek() – 返回队列首部的元素。
empty() – 返回队列是否为空。
思路:
push这个就直接放到栈里面就是尾部了
pop这个用到两个栈,第一个栈负责存放一开始放进来的东西,然后第二个栈,负责把第一个栈从最外面一个一个往第二个栈送,这样第二个栈最外面就是第一个栈最里面的元素,也是队列最先放进去的元素,此时直接移除第一个元素就是队列的首部元素
peek这个就是用到上面那个,先取出首部元素,移除以后再放回去就行了
empty就是检测两个栈是不是都没元素,如果都没元素就空了
代码:
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())
{
stOut.push(stIn.top());
stIn.pop();
}
}
int result=stOut.top();
stOut.pop();
return result;
}
int peek() {
int res = this->pop();
stOut.push(res);
return res;
}
bool empty() {
return stIn.empty()&&stOut.empty();
}
};
记住栈的操作
stIn.top()栈的最上面的一个元素
stIn.pop()把栈的最上面的元素移除出来
stIn.push(x)把x放进去栈里面
三、用队列实现栈
思路:计算队列的长度,然后需要输出的队列最后一个前面一个一个弹出去,再加入,这样输出front就是栈顶元素,记得在弹出最后一个元素之前,得把他保留下来,不然就返回不了这个元素了。
class MyStack {
public:
queue<int> que;
MyStack() {
}
void push(int x) {
que.push(x);
}
int pop() {
int n=que.size()-1;
while(n--)
{
que.push(que.front());
que.pop();
}
int c=que.front();
que.pop();
return c;
}
int top() {
return que.back();
}
bool empty() {
return que.empty();
}
};