- c++ 栈的底层实现可以是vector,deque,list(可插拔的底层实现), 主要就是数组和链表的底层实现;
- SGI STL中,栈、队列底层实现缺省情况下一样使用deque实现的;
- 两者不允许有遍历行为,不提供迭代器
stack.pop()是无返回值的
232. 用栈实现队列
要点
pop的实现:每次要将所有in栈中的元素置于out栈中,不可只转移部分(破坏顺序)peek巧妙地利用pop
栈实现队列
class MyQueue {
public:
stack<int> stackIn;
stack<int> stackOut;
MyQueue() {
}
void push(int x) {
stackIn.push(x);
}
int pop() {
if (stackOut.empty()) {
while (!stackIn.empty()) {
stackOut.push(stackIn.top());
stackIn.pop();
}
}
int res = stackOut.top();
stackOut.pop();
return res;
}
int peek() {
int res = this->pop();
stackOut.push(res);
return res;
}
bool empty() {
return stackIn.empty() && stackOut.empty();
}
};
总结
分别用in栈和out栈实现了队列的操作,思路清晰,就是两个栈中元素的转移是有需要注意的细节
225. 用队列实现栈
要点
- 不像上题用两个栈实现队列,本题不能用类似的两个队列实现栈,因为在两个队列里捣,元素的顺序还是FIFO
- 主要就是pop的逻辑,别的都可以直接调队列的函数实现;pop时,把除了队尾元素的其他元素都重新出队入队一次
队列实现栈
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 res = que.front();
que.pop();
return res;
}
int top() {
return que.back();
}
bool empty() {
return que.empty();
}
};
总结
std实现的栈和队列,pop方法都是无返回值的,通过top、front、back获取端的元素。