理论基础总结:原文章来自代码随想录 代码随想录 (programmercarl.com)
栈与队列是STL里面的两个数据库,学习的栈与队列也是SGI STL里面的数据结构
队列是先进先出,栈是先进后出
- C++中stack 是容器么?
- 我们使用的stack是属于哪个版本的STL?
- 我们使用的STL中stack是如何实现的?
- stack 提供迭代器来遍历stack空间么?
回答一下代码随想录中的问题。
1,STL中栈不被归类为容器,而被归类为container adapter(容器适配器),同样队列也是
2,SGI STL
3,栈的底层实现可以是vector,deque,list都是可以的,主要就是数组和链表的底层实现
4,栈提供push和pop等等接口,所有元素必须符合先进后出规则,所以栈不提供走访功能,也不提供迭代器
我们常用的SGI STL,如果没有指定底层实现的话,默认是以deque为缺省情况下栈的底层实现,也可以指定vector为栈的底层实现。
SGI STL中队列一样是以deque为缺省情况下的底部结构,也可以指定list为底层实现。
232、用栈实现队列
文章链接:代码随想录 (programmercarl.com)
以下代码和思路参考代码随想录。
思路:使用栈模拟队列的行为,需要两个栈,一个输出栈,一个输入栈,在push数据的时候,只要数据放进输入栈就好,但在pop的时候,操作就复杂一些,输出栈如果为空,就把进栈数据全部导入进来(注意是全部导入),再从出栈弹出数据,如果输出栈不为空,则直接从出栈弹出数据就可以了。peek就是获取队列里面出口处的第一个元素值是多少
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();
}
};
225、用队列实现栈
文章链接:代码随想录 (programmercarl.com)
思路:一个队列模拟栈弹出元素时,只需要将队列头部的元素重新添加到队列尾部,此时再弹出元素就是栈的顺序了 思路原文来自代码随想录
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();
}
};