def __init__(self):
self.Que_1 = []
self.Que_2 = []
def push(self, x: int) -> None:
# Push element x onto stack.
self.Que_1.append(x)
def pop(self) -> int:
# Removes the element on top of the stack and returns that element.
while len(self.Que_1)>1:
self.Que_2.append(self.Que_1.pop(0))
res = self.Que_1.pop(0)
self.Que_1, self.Que_2 = self.Que_2, self.Que_1
self.Que_2.clear()
return res
def top(self) -> int:
# Get the top element.
while len(self.Que_1)>1:
self.Que_2.append(self.Que_1.pop(0))
res = self.Que_1[0]
self.Que_2.append(self.Que_1.pop(0))
self.Que_1, self.Que_2 = self.Que_2, self.Que_1
self.Que_2.clear()
return res
def empty(self) -> bool:
return not self.Que_1
}
void push(int x) {
q1.push(x);
}
int pop() {
int size = q1.size();
size--;
while(size--)
{
q2.push(q1.front());
q1.pop();
}
int res = q1.front();
q1.pop();
q1 = q2;
while(!q2.empty())
{
q2.pop();
}
return res;
}
int top() {
return q1.back();
}
bool empty() {
return q1.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();
*/
}
void push(int x) {
q2.push(x);
while(!q1.empty())
{
q2.push(q1.front());
q1.pop();
}
swap(q1,q2);
}
int pop() {
int r = q1.front();
q1.pop();
return r;
}
int top() {
// int r = q1.front();
return q1.front();
}
bool empty() {
if (q1.empty())
{
return true;
}
else
{
return false;
}
}
};
/**
* 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();
*/
class MyStack {
Queue<Integer> queue1;
Queue<Integer> queue2;
public MyStack() {
queue1 = new ArrayDeque<>();
queue2 = new ArrayDeque<>();
}
public void push(int x) {
queue2.offer(x);
while (!queue1.isEmpty()) {
queue2.offer(queue1.poll());
}
queue1 = queue2;
queue2 = new ArrayDeque<>();
}
public int pop() {
return queue1.poll();
}
public int top() {
return queue1.peek();
}
public boolean empty() {
return queue1.isEmpty();
}
}
“`C++
class MyStack {
public:
queue queue1, queue2;
MyStack() {
}
void push(int x) {
queue2.push(x);
while(!queue1.empty()) {
queue2.push(queue1.front());
queue1.pop();
}
swap(queue1, queue2);
}
int pop() {
int a = queue1.front();
queue1.pop();
return a;
}
int top() {
int a = queue1.front();
return a;
}
bool empty() {
return queue1.empty();
}
};
“`C++
使用两个queue 来实现栈,
让queue1始终是栈的格式, 最前面的是栈顶,也就是最后加入的值。
让queue2作为中转栈,每次加入一个元素时,把queue1的元素依次加到queue2中,然后再交换queue1和queue2,这样新加入的元素又到了queue1的最前面。
pop 和 top 其实就很简单了。只需要操作最前面的元素即可。
class MyStack {
Queue<Integer> queueA ,queueB;
public MyStack() {
queueA = new LinkedList<>();
queueB = new LinkedList<>();
}
public void push(int x) {
queueB.offer(x);
while (!queueA.isEmpty()) {
queueB.offer(queueA.poll());
}
while (!queueB.isEmpty()) {
queueA.offer(queueB.poll());
}
}
public int pop() {
return queueA.poll();
}
public int top() {
return queueA.peek();
}
public boolean empty() {
return queueA.isEmpty();
}
}
/**
* 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();
* boolean param_4 = obj.empty();
*/
class MyStack {
public:
queue queue1;
queue queue2;
/** Initialize your data structure here. */
MyStack() {
}
/** Push element x onto stack. */
void push(int x) {
queue2.push(x);
while (!queue1.empty()) {
queue2.push(queue1.front());
queue1.pop();
}
swap(queue1, queue2);
}
/** Removes the element on top of the stack and returns that element. */
int pop() {
int r = queue1.front();
queue1.pop();
return r;
}
/** Get the top element. */
int top() {
int r = queue1.front();
return r;
}
/** Returns whether the stack is empty. */
bool empty() {
return queue1.empty();
}
public MyStack() {
queue = new LinkedList<>();
}
public void push(int x) {
queue.offer(x);
int size = queue.size();
while(size -- > 1){
queue.offer(queue.poll());
}
return;
}
public int pop() {
return queue.poll();
}
public int top() {
return queue.peek();
}
public boolean empty() {
return queue.isEmpty();
}
}
/**
* 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();
* boolean param_4 = obj.empty();
*/
class MyStack {
public:
queue q1;
queue q2;
MyStack() {
}
void push(int x) {
q2.push(x);
while(!q1.empty()){
q2.push(q1.front());
q1.pop();
}
swap(q1,q2);
}
int pop() {
int ans = q1.front();
q1.pop();
return ans;
}
int top() {
return q1.front();
}
bool empty() {
return q1.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();
*/
时间复杂度O(n)
class MyStack {
Queue queue1;
Queue queue2;
public MyStack() {
queue1 = new LinkedList<>();
queue2 = new LinkedList<>();
}
public void push(int x) {
queue2.offer(x);
while (!queue1.isEmpty()) {
queue2.offer(queue1.poll());
}
Queue temp = queue1;
queue1 = queue2;
queue2 = temp;
}
public int pop() {
return queue1.poll();
}
public int top() {
return queue1.peek();
}
public boolean empty() {
return queue1.isEmpty();
}
}
/**
* 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();
* boolean param_4 = obj.empty();
*/
Queue<Integer> queue;
public MyStack() {
queue = new LinkedList<>();
}
//每 offer 一个数(A)进来,都重新排列,把这个数(A)放到队列的队首
public void push(int x) {
queue.offer(x);
int size = queue.size();
//移动除了 A 的其它数
while (size-- > 1)
queue.offer(queue.poll());
}
public int pop() {
return queue.poll();
}
Deque<Integer> queue1;
Deque<Integer> queue2;
public MyStack() {
queue1 = new ArrayDeque<>();
queue2 = new ArrayDeque<>();
}
public void push(int x) {
queue2.addLast(x);
while(!queue1.isEmpty()){
queue2.addLast(queue1.removeFirst());
}
Deque<Integer> q = queue1;
queue1 = queue2;
queue2 = q;
}
public int pop() {
return queue1.removeFirst();
}
public int top() {
return queue1.getFirst();
}
public boolean empty() {
return queue1.isEmpty();
}
}
/**
* 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();
* boolean param_4 = obj.empty();
*/
class MyStack {
Queue q1;
Queue q2;
public MyStack() {
q1 = new LinkedList();
q2 = new LinkedList();
}
public void push(int x) {
q2.offer(x);
while (!q1.isEmpty())
{
q2.offer(q1.poll());
}
Queue<Integer> tem = q1;
q1 = q2;
q2 = tem;
}
public int pop() {
return q1.poll();
}
public int top() {
return q1.peek();
}
public boolean empty() {
return q1.isEmpty();
}
}
/**
* 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();
* boolean param_4 = obj.empty();
*/打卡
public MyStack() {
queue1 = new LinkedList<>();
queue2 = new LinkedList<>();
}
public void push(int x) {
if (!queue2.isEmpty()){
Queue<Integer> temp = queue2;
queue2 = queue1;
queue1 = temp;
}
queue1.offer(x);
}
public int pop() {
if (queue1.isEmpty() && queue2.isEmpty()) return -1;
if (!queue2.isEmpty()){
Queue<Integer> temp = queue2;
queue2 = queue1;
queue1 = temp;
}
while (!queue1.isEmpty()){
Integer poll = queue1.poll();
if (queue1.isEmpty()) return poll;
queue2.offer(poll);
}
return -1;
}
public int top() {
if (queue1.isEmpty() && queue2.isEmpty()) return -1;
if (!queue2.isEmpty()){
Queue<Integer> temp = queue2;
queue2 = queue1;
queue1 = temp;
}
while (!queue1.isEmpty()){
Integer poll = queue1.poll();
queue2.offer(poll);
if (queue1.isEmpty()) return poll;
}
return -1;
}
public boolean empty() {
return queue2.isEmpty() && queue1.isEmpty();
}
}
/**
* 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();
* boolean param_4 = obj.empty();
*/
class MyStack {
//定义队列
Queue queue1;
Queue queue2;
public MyStack() {
queue1 = new LinkedList<Integer>();
queue2 = new LinkedList<Integer>();
}
//入栈 用两个队列实现
public void push(int x) {
queue2.offer(x);//在队列末尾添加x
while(!queue1.isEmpty()){
queue2.offer(queue1.poll());
}
//将两个队列元素互换
Queue<Integer> temp = queue1;
queue1 = queue2;
queue2 = temp;
}
public int pop() {
return queue1.poll();
}
public int top() {
return queue1.peek();
}
public boolean empty() {
return queue1.isEmpty();
}
}
/**
* 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();
* boolean param_4 = obj.empty();
*/
重点在于思路理解,如何转换
时间复杂度 O(1)
空间复杂度O(n)
class MyStack {
Queue<Integer> queue;
public MyStack() {
queue = new LinkedList<>();
}
public void push(int x) {
// 先取出size
int n = queue.size();
queue.offer(x);
for(int i = 0; i < n; i++){
queue.offer(queue.poll());
}
}
public int pop() {
return queue.poll();
}
public int top() {
return queue.peek();
}
public boolean empty() {
return queue.isEmpty();
}
}
class MyStack
{
public:
MyStack()
{}
void push(int x)
{
main.push(x);
}
int pop()
{
int res = main.back();
int n = main.size();
for(int i = 0; i < n - 1; i++)
{
main.push(main.front());
main.pop();
}
main.pop();
return res;
}
int top()
{
return main.back();
}
bool empty()
{
return main.empty();
}
private:
queue<int> main;
};
/**
* 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();
*/
void push(int x) {
q1.push(x);
while (!q2.empty()){
int n = q2.front();
q2.pop();
q1.push(n);
}
while (!q1.empty()){
int n = q1.front();
q1.pop();
q2.push(n);
}
}
int pop() {
int n = q2.front();
q2.pop();
return n;
}
int top() {
return q2.front();
}
bool empty() {
return q2.empty();
}
public MyStack() {
q1 = new LinkedList<Integer>();
q2 = new LinkedList<Integer>();
}
public void push(int x) {
if(q1.isEmpty()){
q1.offer(x);
while(!q2.isEmpty()){
q1.offer(q2.poll());
}
}
else{
q2.offer(x);
while(!q1.isEmpty()){
q2.offer(q1.poll());
}
}
}
public int pop() {
if(!q1.isEmpty()){
int ans = q1.poll();
return ans;
}
else{
int ans = q2.poll();
return ans;
}
}
public int top() {
if(!q1.isEmpty()){
int ans = q1.peek();
return ans;
}
else{
int ans = q2.peek();
return ans;
}
}
public boolean empty() {
if(q1.isEmpty() && q2.isEmpty())
return true;
else
return false;
}
class MyStack {
Deque<Integer> queue1;
Deque<Integer> queue2;
public MyStack() {
queue1 = new LinkedList<>();
queue2 = new LinkedList<>();
}
public void push(int x) {
queue1.offer(x);
}
public int pop() {
while(queue1.size()!=1){
queue2.offer(queue1.poll());
}
int val = queue1.poll();
while(!queue2.isEmpty()){
queue1.offer(queue2.poll());
}
return val;
}
public int top() {
int val = pop();
push(val);
return val;
}
public boolean empty() {
return queue1.isEmpty();
}
}
思路:一个队列专门用来存储数据queue1,另一个队列queue2用来中转
push方法直接将数据插入queue1的队尾中,时间复杂度是O(1)
pop方法输出的值应该是queue1的最后一个值,所以将前面的所有值中转到queue2中,所需要的值之后,再将queue2中的值中转回来,时间复杂度:O(n)
top方法是获取栈顶元素,和pop思路一样,不过不能删除,相当于pop之后再push进来,时间复杂度:O(n)
empty直接返回queue是否为空,时间复杂度为O(1)
共以下 48 个回答
class MyStack:
入栈操作(push):O(1)
出栈操作(pop):平均情况下接近O(1),最坏情况下O(n)
获取栈顶元素(top):平均情况下接近O(1),最坏情况下O(n)
判空操作(empty):O(1)
//用两个队列实现栈,关键在于q1,q2是备份,难点在于pop,只让q1保留一个元素,其余的都备份到q2,如何实现这个while(size–) q1; q2;
class MyStack {
public:
queue
queue
MyStack() {
};
/**
* 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();
*/
class MyStack:
思路:两个队列
q1用来储存,q2用来辅助
q1中存储的数字已经按照先进在后的方式存储
每次新增加一个数字,都先存在q2中,再将q1 popleft将q1中的结果按照在进在后的顺序存到q2中
再将q1 q2呼唤。这样q1就达到存储目的
时间复杂度:o(n)
空间复杂度:o(1)
from collections import deque #这是一个双端队列
class MyStack:
def init(self):
self.queue1 = deque()
self.queue2 = deque()
时间复杂度O(n)空间复杂度O(1) q1; q2; q1; q2;
class MyStack {
public:
queue
queue
MyStack() {
std::queue
std::queue
};
/**
* 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();
*/
时间复杂度:O(n)
空间复杂度:O(1)
思路:两个队列,先入一个队列,再将另一个队列的所有元素插入这个队列,然后两者互换
代码:
“`c++
class MyStack { q1; q2;
public:
queue
queue
MyStack() {
};
空间O(1),时间O(n)
进2队,再把1队搬过来2队依次入队,交换1,2队,这样就能实现后进先出。
“`
“`C++ queue1, queue2;
class MyStack {
public:
queue
MyStack() {
};
“`C++
使用两个queue 来实现栈,
让queue1始终是栈的格式, 最前面的是栈顶,也就是最后加入的值。
让queue2作为中转栈,每次加入一个元素时,把queue1的元素依次加到queue2中,然后再交换queue1和queue2,这样新加入的元素又到了queue1的最前面。
pop 和 top 其实就很简单了。只需要操作最前面的元素即可。
class MyStack {
public:
};
采用两个队列,一个作为临时队列,
每次push(x)时,把x放入临时队列中,再将另一个队列中的元素依次出队再入队,然后swap
栈和队列的实现就是互相倒来倒去,时间复杂度O(n),空间复杂度O(1)
class MyStack { A; B; (); ();
Queue
Queue
public MyStack() {
A = new LinkedList
B = new LinkedList
}
}时间复杂度O(n)空间复杂度O(n)
两个列队实现栈
队列是先进先出的数据结构,实现一个栈先进后出的效果。
队列A作为存储结构,队列B辅助存储
1、除了存储offer时,主程序其他操作(取最新值、删除最新值、获取是否为空)与队列中方法一致
2、存储值时,先将值保存在队列B中,然后将队列A中值按先进先出的顺序保存在队列B中; 然后再将队列B中的值按先进先出的顺序保存在队列A中,则此时最新保存的值会在列队最前面,如果取值会先取出
class MyStack { queue1; queue2;
public:
queue
queue
};
时间复杂度除了添加是O(n),其它都是O(1);
空间复杂度是O(n)
java queue1; queue2;
class MyStack{
Queue
Queue
}
提交
时间复杂度 除了添加操作是 O(n),其他操作都是 O(1)
空间复杂度 添加操作是 O(n)
class MyStack { queue;
// 用一个队列实现
Queue
}
/**
* 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();
* boolean param_4 = obj.empty();
*/
class MyStack { q1; q2;
public:
queue
queue
MyStack() {
};
/**
* 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();
*/
时间复杂度O(n)
使用队列queue中的add poll peek 以及size方法实现FILO
时间复杂度O(n)空间复杂度为O(n)
思路
插入数据时两种情况
其中一个queue有值,向有数据的queue插值
两个都没值,选择list1插入
删除元素两种情况
list中有值
list1 中有值 -> 一直poll到list2中,直到list1.size() 1
list2中有值 -> 一直poll到list1中,直到list2.size() 1
list没有值
时间复杂度:入栈操作 O(n),其余操作都是 O(1)
空间复杂度:O(n)
一个队列实现栈的入队出队操作
class MyStack {
}
class MyStack {
}
/**
* 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();
* boolean param_4 = obj.empty();
*/
插入时间复杂度O(n),其余时间复杂度O(1);
空间复杂度O(n)。
class MyStack { q1; q2; (); ();
Queue
Queue
public MyStack() {
q1 = new LinkedList
q2 = new LinkedList
}
}
/**
* 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();
* boolean param_4 = obj.empty();
*/打卡
队列实现栈 queue1; queue2;
class MyStack {
Queue
Queue
}
/**
* 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();
* boolean param_4 = obj.empty();
*/
class MyStack { queue1; queue2;
//定义队列
Queue
Queue
}
/**
* 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();
* boolean param_4 = obj.empty();
*/
重点在于思路理解,如何转换
时间复杂度 O(1)
空间复杂度O(n)
public MyStack() {(); ();
queue1 = new LinkedList
queue2 = new LinkedList
}
思路:用一个队列即可 每次将前size-1个元素先出队再入队,插入就正常做
思路:定义两个队列 qIn, qOut, 分别负责栈的输入与输出。输入时使用
qIn.push(x), 输出时先将qIn内的数据输出到qOut(剩余一个元素在qIn),然后输出剩余的一个元素即为栈顶元素,最后将qOut的数据又输入到qIn内。“`c++
class MyStack {
public:
MyStack() {
private: qIn, qOut;
queue
};
“`
打卡
https://leetcode.cn/problems/implement-stack-using-queues/solutions/2668150/dui-lie-mo-ni-zhan-by-yukislab-8c7t
时空复杂度O(n)
class MyStack { queue1; queue2; (); ();
Queue
Queue
public MyStack() {
queue1=new LinkedList
queue2=new LinkedList
}
}
利用两个队列实现栈,其中队列2为辅助角色,每次都将新插入的元素放入其中,并将队列1中的依次插入队列2,以此维护“先进后出”的栈风格,最后将队列1和队列2互换,保持队列2经常为空。
时间复杂度O(n),空间复杂度O(n)
时间复杂度O(n),空间复杂度O(n)
day4第二题
使用两个队列模拟一个栈操作。队列2用来辅助入栈操作。队列1保存出队列的数据与出栈的数据是一致的。
时间复杂度O(n*(n+1)/2)
空间复杂度O(2n)
C++
class MyStack { q1; q2;
public:
queue
queue
MyStack() {
}
};
时空复杂度O(n)
class MyStack { q1; q2;
Queue
Queue
}
//每次插入,先插入空队列,然后把另一队列内容插入到本队列队尾。便能始终保持队列倒置。
//时间复杂度 push O(n) popO(1)
//空间复杂度 O1
class MyStack:
Your MyStack object will be instantiated and called as such:
obj = MyStack()
obj.push(x)
param_2 = obj.pop()
param_3 = obj.top()
param_4 = obj.empty()
时间o(n) 空间o(1)