232. 用栈实现队列
题目链接:LeetCode232. 用栈实现队列
请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(push
、pop
、peek
、empty
):
实现 MyQueue
类:
void push(int x)
将元素 x
推到队列的末尾
int pop()
从队列的开头移除并返回元素
int peek()
返回队列开头的元素
boolean empty()
如果队列为空,返回 true
;否则,返回 false
说明:
你 只能 使用标准的栈操作 —— 也就是只有 push to top
, peek
/pop from top
, size
, 和 is empty
操作是合法的。
你所使用的语言也许不支持栈。你可以使用 list
或者 deque
(双端队列)来模拟一个栈,只要是标准的栈操作即可。
思路:在push数据的时候,只要数据放进输入栈就好;但在pop的时候,输出栈如果为空,就把进栈数据全部导入进来(注意是全部导入),再从出栈弹出数据,如果输出栈不为空,则直接从出栈弹出数据就可以了。
code:
class MyQueue {
public:
stack<int> stcIn;
stack<int> stcOut;
MyQueue() {
}
void push(int x) {
stcIn.push(x);
}
int pop() {
if(stcOut.empty()){
while(!stcIn.empty()){
stcOut.push(stcIn.top());
stcIn.pop();
}
}
int result = stcOut.top();
stcOut.pop();
return result;
}
int peek() {
int peek = this->pop();
stcOut.push(peek);
return peek;
}
bool empty() {
return stcIn.empty() && stcOut.empty();
}
};
总结:pop()
和 peek()
两个函数功能类似,peek()
的实现,直接复用了pop()
。
225. 用队列实现栈
题目链接:LeetCode225. 用队列实现栈
请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(push
、top
、pop
和 empty
)。
实现 MyStack
类:
void push(int x)
将元素 x 压入栈顶。
int pop()
移除并返回栈顶元素。
int top()
返回栈顶元素。
boolean empty()
如果栈是空的,返回 true
;否则,返回 false
。
思路:使用一个队列实现,总要有一个反转操作,可以在入队时反转,也可以在出队反转。这里通过在入队时反转队列元素实现栈的效果。但是每次出栈入栈时间复杂度都是 O(n)
。
code:
class MyStack {
public:
queue<int> que;
MyStack() {
}
void push(int x) {
int size = que.size();
que.push(x);
for(int i = 0; i < size; i++){
que.push(que.front());
que.pop();
}
}
int pop() {
int front = que.front();
que.pop();
return front;
}
int top() {
return que.front();
}
bool empty() {
return que.empty();
}
};