Day10——栈与队列
● 理论基础
● 232.用栈实现队列
● 225. 用队列实现栈
理论基础
- C++中stack 是容器么?
不是容器,属于容器适配器
栈是以底层容器完成其所有的工作,对外提供统一的接口,底层容器是可插拔的(也就是说我们可以控制使用哪种容器来实现栈的功能)。(代码随想录) - 我们使用的stack是属于哪个版本的STL?
SGI STL 对我来说不重要 - 我们使用的STL中stack是如何实现的?
默认使用deque, 但是 list、 vector、 链表都可以 - stack 提供迭代器来遍历stack空间么?
不提供,只有push pop 因为栈的所有元素都必须满足先进后出。
我们也可以指定vector为栈的底层实现,初始化语句如下:
// 使用vector为底层容器的栈, 缺省默认为deque
std::stack<int, std::vector<int> > third;
队列中先进先出的数据结构,同样不允许有遍历行为,不提供迭代器, SGI STL中队列一样是以deque为缺省情况下的底部结构。
232.用栈实现队列
思路:始终保持一个空栈,每次入队列,先把当前栈中元素放入另一个空栈,再入当前栈,然后将另一个栈中所有元素全都加入当前栈。
即: abcd + null + e = null + dcba + e = e + dcba = null + abcde;
好吧,确实不需要,入队一个栈,出队一个栈,注意pop和peek就行。。
class MyQueue {
stack<int> inSt;
stack<int> outSt;
public:
MyQueue() {
}
void push(int x) {
inSt.push(x);
}
int pop() {
if(outSt.empty()) { // 只有输出栈为空的情况下才从输入栈拿
while(!inSt.empty()) {
int tmp = inSt.top();
inSt.pop();
outSt.push(tmp);
}
}
int tmp = outSt.top();
outSt.pop();
return tmp;
}
int peek() {
int num = this->pop(); // 直接从输出站取首位。
outSt.push(num);
return num;
}
bool empty() {
return inSt.empty() && outSt.empty();
}
};
225.用队列实现栈
思路:第一反应是一个进一个出,发现不可能。再想想只能是反转后再pop了。
以前不怎么用queue,甚至都忘了有什么方法。上一题首元素用的peek,我也用,发现没有换top,确实是思考一下都费劲。。。整理一下成员函数
back() //返回队列中最后一个元素
front() //返回队列中的第一个元素
empty() //判断队列是否为空
pop() //删除队列的第一个元素
push() //在队列末尾加入一个元素
size() //返回队列中元素的个数
class MyStack {
queue<int> que1;
queue<int> que2;
public:
MyStack() {
}
void push(int x) {
que1.push(x);
return;
}
int pop() {
while(que1.size() > 1){
int tmp = que1.front();
que1.pop();
que2.push(tmp);
}
int tmp = que1.front();
que1.pop();
while(!que2.empty()) {
int tmp = que2.front();
que2.pop();
que1.push(tmp);
}
return tmp;
}
int top() {
return que1.back();
}
bool empty() {
return que1.empty();
}
};