(LeetCode)两个队列来实现一个栈

原题例如以下:

Implement the following operations of a stack using queues.

  • push(x) -- Push element x onto stack.
  • pop() -- Removes the element on top of the stack.
  • top() -- Get the top element.
  • empty() -- Return whether the stack is empty.

Notes:

  • You must use only standard operations of a queue -- which means only push
    to back
    peek/pop from frontsize,
    and is empty operations are valid.
  • Depending on your language, queue may not be supported natively. You may simulate a queue by using a list or deque (double-ended queue), as long as you use only standard operations of a queue.
  • You may assume that all operations are valid (for example, no pop or top operations will be called on an empty stack).

基本思路是:如果有两个队列Q1和Q2,当二者都为空时。入栈操作能够用入队操作来模拟,能够随便选一个空队列,如果选Q1进行入栈操作。如今如果a,b,c依次入栈了(即依次进入队列Q1)。这时如果想模拟出栈操作,则须要将c出栈。由于在栈顶。这时候能够考虑用空队列Q2,将a,b依次从Q1中出队,而后进入队列Q2,将Q1的最后一个元素c出队就可以。此时Q1变为了空队列。Q2中有两个元素,队头元素为a。队尾元素为b。接下来如果再运行入栈操作,则须要将元素进入到Q1和Q2中的非空队列,即进入Q2队列,出栈的话,就跟前面的一样。将Q2除最后一个元素外所有出队,并依次进入队列Q1,再将Q2的最后一个元素出队就可以。

Java实现代码例如以下:

class MyStack {	LinkedList<Integer> queue1 = new LinkedList<Integer>();
	LinkedList<Integer> queue2 = new LinkedList<Integer>();
    // Push element x onto stack.
    public void push(int x) {
        if(queue1.size()==0&&queue2.size()==0)
        {
        	queue1.offer(x);
        }
        else if(queue1.size()==0)
        {
        	queue2.offer(x);
        }
        else
        {
        	queue1.offer(x);
        }
    }

    // Removes the element on top of the stack.
    public void pop() {
    	if(queue1.size()!= 0)
    	{
    		int length = queue1.size();
        for(int i =0;i<length-1;i++)
        {
        	queue2.offer(queue1.poll());
        }
        queue1.poll();
    	}
    	else
    	{
    		int length = queue2.size();
    	for(int i =0;i<length-1;i++)
    	{
    		queue1.offer(queue2.poll());
    	}
    	 queue2.poll();
    	}
    }
    // Get the top element.
    public int top() {
    	if(queue1.size()!= 0)
    	{
    		int length = queue1.size();
        for(int i =0;i<length-1;i++)
        {
        	queue2.offer(queue1.poll());
        }
        int result =  queue1.element();
        queue2.offer(queue1.poll());
		return result;
    	}
    	else
    	{
    		int length = queue2.size();
    	for(int i =0;i<length-1;i++)
    	{
    		queue1.offer(queue2.poll());
    	}
    	int result = queue2.element();
    	queue1.offer(queue2.poll());
    	return result;
    	}
    }

    // Return whether the stack is empty.
    public boolean empty() {
        return queue1.size()==0&&queue2.size()==0;
    }

}
时间: 2024-10-19 23:13:45

(LeetCode)两个队列来实现一个栈的相关文章

用两个队列模拟实现一个栈的过程

栈具有"后进先出"的特点,即某个元素最后进入栈,却最先出栈:队列具有"先进先出"的特点,即元素从队尾依次进队列,依次从队头出队列:现在用两个队列模拟实现一个栈的过程,详细过程请看下面这张本人制作的gif图: 实现代码: #include <iostream> using namespace std; #include <queue> template <typename T> class Stack { public: void

栈和队列:用一个栈实现另一个栈的排序

题目: 一个栈中的元素类型为整型,现在想将该栈从顶到底按从大到小的顺序排序,只允许申请一个栈.如何完成排序? 将排序的栈记为 stack,辅助栈记为 help,在stack上执行pop操纵,弹出的元素为 tmp 1. 如果 tmp 大于或等于 help 的栈顶元素或 help 为空,则将 tmp 压入 help: 2. 如果 tmp 小于 help 的栈顶则将 help 的元素弹出,逐一压入 stack,直到 tmp 大于或等于 help 的栈顶元素,再将 tmp 压入 help: 一直执行到

两个队列实现一个栈

两个队列("先进先出")实现一个栈("后进先出") //.h #include<iostream> using namespace std; #include <queue> #include<string> template<class T> class Stack { public:     Stack() :_size(0) {}     ~Stack() {}       void Push(T t);    

剑指offer:两个队列模拟一个栈

题目描述用两个队列来实现一个栈,完成栈的Push和Pop操作. 队列中的元素为int类型. 实现方式其实和两个栈模拟一个队列相似,但是区别在于这两个队列的作用和那两个栈的作用不一样. class Solution: """ 用两个队列模拟一个栈,如果两个队列的容量分别为M和N,其中M > N,那么模拟得到的栈的容量是N+1 因为假设先把queue1塞进N+2个,此时将元素出栈,则需要先将queue1的N+1个元素出队后压入queue2, 由于queue2的容量只有N,入

LeetCode——225. 用队列实现栈

使用队列实现栈的下列操作: push(x) -- 元素 x 入栈 pop() -- 移除栈顶元素 top() -- 获取栈顶元素 empty() -- 返回栈是否为空 注意: 你只能使用队列的基本操作-- 也就是 push to back, peek/pop from front, size, 和 is empty 这些操作是合法的. 你所使用的语言也许不支持队列. 你可以使用 list 或者 deque(双端队列)来模拟一个队列 , 只要是标准的队列操作即可. 你可以假设所有操作都是有效的(例

用两个队列实现一个栈

前面说了用两个栈实现一个队列的算法,现在在写一个反过来的算法: 1.算法描述: 栈的特点就是先进后出,而队列的特点就是先进先出,基于两者的特点,有了此算法: 先看一张图:都喜欢图,图也能直接表达题的意思和本人的意思: 图中已经说的很清楚了,多余的方法暂且不说,按以上的图和思路,我给出以下代码:供自己参考: /* *设有两个队列A和B,栈的push操作,直接push到A的队尾就行了. *栈的pop操作时,将A中的队列依次取出放到B中,取到最后一个时, *最后一个不要放到B中,直接删掉,再将B中的值

java-57-用两个栈实现队列&amp;&amp;用两个队列实现一个栈

转自:http://bylijinnan.iteye.com/blog/1450125 ———————————————————————————————————————————— Java代码   import java.util.ArrayList; import java.util.List; import java.util.Stack; /* * Q 57 用两个栈实现队列 */ public class QueueImplementByTwoStacks { private Stack<

剑指offer编程题Java实现——面试题7相关题用两个队列实现一个栈

剑指offer面试题7相关题目:用两个队列实现一个栈 解题思路:根据栈的先入后出和队列的先入先出的特点1.在push的时候,把元素向非空的队列内添加2.在pop的时候,把不为空的队列中的size()-1份元素poll出来,添加到另为一个为空的队列中,再把队列中最后的元素poll出来两个队列在栈不为空的情况下始终是有一个为空,另一个不为空的.push添加元素到非空的队列中,pop把非空队列的元素转移到另一个空的队列中,直到剩下最后一个元素,这个元素就是要出栈的元素(最后添加到队列中的元素). 1

两个栈实现一个队列,两个队列实现一个栈

1.两个栈实现一个队列 有三种思路: 思路一:将stack1作为存储空间,将stack2作为临时缓冲区,入队时,直接压入stac1,出队时,将stack1中的元素依次出栈压入stack2中,再将stack2的栈顶元素弹出,最后将stack2中的元素再倒回给stack1 思路二:入队时,判断stack1是否为空,如果stack1为空,则将stack2中的所有元素都倒入stack1中,再将元素直接压入stack1,否则,直接压入stack1中 出队时,判断stack2是否为空,如果stack2为空,