- C++中stack queue是容器么?
- 准确来说,stack,queue都是由C++容器库中的容器实现的,默认是deque,所以stack,queue并不是容器,stack,queue被成为容器适配器。
- 我们使用的stack,queue是属于哪个版本的STL?
- SGI STL 由Silicon Graphics Computer Systems公司参照HP STL实现,被Linux的C++编译器GCC所采用,SGI STL是开源软件,源码可读性甚高 。
- stack queue提供迭代器来遍历空间么?
- 由于栈和队列都是有严格进出顺序的数据结构,所以是不具有迭代器的。
文档讲解:代码随想录 (programmercarl.com)
视频讲解:栈的基本操作! | LeetCode:232.用栈实现队列_哔哩哔哩_bilibili
状态:还好
单用一个栈是很难实现队列的,因为栈相对于队列来说,灵活性更差,而且在栈内部很难改变元素之间的顺序。
于是便想到用两个栈来试着解决这个问题,因为栈拥有后进先出的特点,经过两个栈之后,可以发现,一开始进入的元素巧妙地被放置到了栈顶,这样就可以直接用出栈来模拟出队列了。
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()){
int tmp = Stin.top();
Stout.push(tmp);
Stin.pop();
}
}
int result = Stout.top();
Stout.pop();
return result;
}
int peek() {
int tmp = this->pop();
Stout.push(tmp);
return tmp;
}
bool empty() {
if(Stin.empty() && Stout.empty())return true;
else return false;
}
};
/**
* 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();
*/
这里说一下为什么在pop()函数中要先判断if(Stout.empty()),因为如果Stout,也就是引入的第二个数组不为空的话,那么元素出“队列”的顺序会有变化,因为栈是后进先出的。
另外,在实现peek()函数的时候,因为要找出位于栈顶的元素,所以可以直接调用自身的pop()函数,记录下返回值,重新入栈,这样才能保持栈内元素不变,只是获取了栈顶的元素。
文档讲解:代码随想录 (programmercarl.com)
视频讲解:队列的基本操作! | LeetCode:225. 用队列实现栈_哔哩哔哩_bilibili
状态:会做,爱做
书接上回,在用栈实现队列的题目中,我提到了栈的灵活性更低,而且无法改变元素的顺序,所以必须要另一个栈来协助,但是这题不一样,当我们用队列来实现栈的时候,我们可以改变队列中元素的顺序,让新入队的元素放到队头,这样就可以实现一个栈了。下面是我的代码。
class MyStack {
public:
queue<int> que;
MyStack() {
}
void push(int x) {
if(que.empty()){
que.push(x);
return;
}
int length = que.size();
que.push(x);
for(int i = 1;i <= length;i++){
int tmp = que.front();
que.pop();
que.push(tmp);
}
}
int pop() {
int result = que.front();
que.pop();
return result;
}
int top() {
return que.front();
}
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();
*/
其实就push函数比较的复杂,因为我在push函数中就已经改变了队列中元素的位置,所以,后面的pop,top,empty直接按照栈的逻辑来就好。
在push函数中,我在将新元素加入队列之前获取了队列的长度,也就是加入新元素之前队列中元素的个数,当加入新元素后,我只需要将加入前每个元素,先出队在入队,这样先进的元素就可以被放在队尾,而新加入的元素就会在队头。