栈与队列
- 栈(stack):先进后出;队列(queue):先进先出
- 栈和队列是STL里面的两个数据结构
- 栈不能遍历元素,提供
pop
和push
等接口,时间复杂度都为O(1)
- 在SGI STL中,如果没有指定底层实现的话,栈和队列默认底层使用的是
deque
容器
232 用栈实现队列
题目链接:用栈实现队列
思路
首先根据提示代码可以确定:队列只有四个操作:push、pop、peek、empty
。针对push
操作:队列push
依次,栈也push
一次。针对pop
操作:队列pop
一次,pop
的是第一个元素;栈pop
一次,pop
的是最后面的一个元素,因此行为逻辑不统一,需要将栈中元素翻转,翻转后再pop
,就和队列pop
的元素一样。针对peek
操作:队列peek
操作,返回的是队首元素,栈何队列相反,因此也要将栈中的元素翻转。针对empty
判空操作:只有当两个栈中都没有元素时,队列中才没有元素。
cpp
class MyQueue {
public:
MyQueue() {
}
void push(int x) {
stackIn.push(x);
}
int pop() {
if(stackOut.empty()){
while(!stackIn.empty())
{
stackOut.push(stackIn.top());
stackIn.pop();
}
}
int result = stackOut.top();
stackOut.pop();
return result;
}
int peek() {
int result = this->pop();
stackOut.push(result);
return result;
}
bool empty() {
if(stackIn.empty() && stackOut.empty()){
return true;
}
return false;
}
private:
stack<int> stackIn;
stack<int> stackOut;
};
225 用队列实现栈
题目链接:用队列实现栈
思路
本题目和上一题目还是有一些区别的。因为队列总是先进先出 ,你无法翻转队列中的元素。所以当栈进行pop
操作时,将队列中前面的元素都添加到另一个队列中,然后pop
出最后一个元素。
cpp
class MyStack {
public:
MyStack() {
}
void push(int x) {
queue1.push(x);
}
int pop() {
int size = queue1.size()-1;
while(size--){
queue2.push(queue1.front());
queue1.pop();
}
int result = queue1.front();
queue1.pop();
queue1 = queue2;
while(!queue2.empty())
{
queue2.pop();
}
return result;
}
int top() {
int result = this->pop();
queue1.push(result);
return result;
}
bool empty() {
if(queue1.empty()){
return true;
}
return false;
}
private:
queue<int> queue1;
queue<int> queue2;
};
参考链接: