首页 > 试题广场 >

两个队列实现栈

[编程题]两个队列实现栈
  • 热度指数:1557 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
请你仅使用两个队列实现一个后入先出的栈,并支持普通栈的全部四种操作(push、top、pop 和 empty),输入数据保证 pop、top函数操作时,栈中一定有元素。
void push(int element) 将元素 element 压入栈顶。
int pop() 移除并返回栈顶元素。
int top() 返回栈顶元素。
bool empty() 如果栈是空的,返回 true ;否则,返回 false 。

数据范围:操作数量满足,输入的元素满足

示例:
输入:    ["MTY","PSH1","TOP","MTY"]
输出:    ["true","1","false"]
解析:
"MTY"表示当前栈是不是为空=>当前为空,返回"true"
"PSH1"表示将1压入栈中,栈中元素为1
"TOP"表示获取栈顶元素==>返回"1"
"MTY"表示当前栈是不是为空=>当前不为空,返回"false"


注意:
1.你只能使用队列的基本操作 —— 也就是 push to back、peek/pop from front、size 和 is empty 这些操作。
2.你所使用的语言也许不支持队列。 你可以使用 list (列表)或者 deque(双端队列)来模拟一个队列 , 只要是标准的队列操作即可。

示例1

输入

["MTY","PSH1","TOP","MTY"]

输出

["true","1","false"]
import java.util.*;

public class Solution {
	Queue<Integer> queue1 = new LinkedList();
	Queue<Integer> queue2 = new LinkedList();

	public void push(int element) {
		while(!queue1.isEmpty()) {
			queue2.add(queue1.poll());
		}
		queue1.add(element);
		while(!queue2.isEmpty()) {
			queue1.add(queue2.poll());
		}
	}

	public int pop() {
		return queue1.poll();
	}

	public int top() {
		return queue1.peek();

	}

	public boolean empty() {
		return queue1.isEmpty();
	}
}

发表于 2022-08-14 20:01:30 回复(0)
import java.util.*;

public class Solution {
    Queue<Integer> dataQueue = new LinkedList<>();
    Queue<Integer> helpQueue = new LinkedList<>();

    // 入队列直接入存数据的队列即可
    public void push(int x) {
        dataQueue.offer(x);
    }

    // 出队列要注意:
    public int pop() {
        // 1. 不能全出队列,要把最后一个数留在这里,然后去返回
        while (dataQueue.size() > 1) {
            helpQueue.offer(
                dataQueue.poll());// 从dataQueue拿出来的数据直接再放进去helpQueue就行
        }
        // 把第一个队列剩下的那个值保存起来
        int ans = dataQueue.poll();
        // 接下来,交换队列,让数据重新回到dataQueue中
        // 小tips:队列是可以交换的
        Queue<Integer> tmp = dataQueue;
        dataQueue = helpQueue;
        helpQueue = tmp;
        // 最后把刚才的结果返回
        return ans;
    }

    // top方法基本同上
    public int top() {
        while (dataQueue.size() > 1) {
            helpQueue.offer(dataQueue.poll());
        }
        // 我们的目标是把ans返回,但是ans还不能丢
        // 我们就把ans先拿出来
        int ans = dataQueue.poll();
        // 然后再放到helpQueue中
        helpQueue.offer(ans);
        // 然后再把helpQueue队列中的元素迁移到dataQueue中
        Queue<Integer> tmp = dataQueue;
        dataQueue = helpQueue;
        helpQueue = tmp;
        // 然后返回刚才保存的ans
        return ans;
    }

    // 两个队列里面都没有元素了,那就是没元素了
    public boolean empty() {
        return dataQueue.isEmpty() && helpQueue.isEmpty();
    }
}

发表于 2023-01-17 16:32:00 回复(0)
from collections import deque
class Solution:
    def __init__(self):
        self.q1  = deque()
        self.q2 =  deque()

    def push(self, element: int) -> None:
        # write code here
        self.q2.append(element)
        while self.q1:
            self.q2.append(self.q1.popleft())
        self.q1, self.q2 = self.q2, self.q1

    def pop(self) -> int:
        # return xx
        return self.q1.popleft()

    def top(self) -> int:
        # return xx
        return self.q1[0]

    def empty(self) -> bool:
        # return xx 
        return not self.q1

发表于 2022-07-10 15:05:13 回复(0)
# -*- coding:utf-8 -*-
class Solution:
    def __init__(self):
        self.list1 = []
        self.list2 = []

    def push(self, element: int) -> None:
        # write code here
        self.list1.append(element)

    def pop(self) -> int:
        # return xx
        return self.list1.pop()

    def top(self) -> int:
        # return xx
        return self.list1[-1]

    def empty(self) -> bool:
        # return xx
        return len(self.list1) == 0

发表于 2022-04-24 11:27:32 回复(0)
class Solution
{
public:
    void push(int element) 
    {
        queue1.push(element);
    }
    
    void copy(queue<int> &q1, queue<int> &q2) 
    {
        while (q1.size() > 1)
        {
            q2.push(q1.front());
            q1.pop();
        }
    }

    int pop() 
    {
        copy(queue1, queue2);
        int t =  queue1.front();
        queue1.pop();
        while (!queue2.empty())
        {
            queue1.push(queue2.front());
            queue2.pop();
        }
        return t;
    }

    int top() 
    {
        copy(queue1, queue2);
        int t = queue1.front();
        queue2.push(queue1.front());
        queue1.pop();
        while (!queue2.empty())
        {
            queue1.push(queue2.front());
            queue2.pop();
        }
        return t;
    }

    bool empty() 
    {
        if (queue1.empty() && queue2.empty()) return true;
        else return false;
    }

private:
    queue<int> queue1;
    queue<int> queue2;
};

发表于 2022-03-17 14:22:32 回复(0)