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

转自:http://bylijinnan.iteye.com/blog/1450125

————————————————————————————————————————————

Java代码  

  1. import java.util.ArrayList;
  2. import java.util.List;
  3. import java.util.Stack;
  4. /*
  5. * Q 57 用两个栈实现队列
  6. */
  7. public class QueueImplementByTwoStacks {
  8. private Stack<Integer> stack1;
  9. private Stack<Integer> stack2;
  10. QueueImplementByTwoStacks(){
  11. stack1=new Stack<Integer>();
  12. stack2=new Stack<Integer>();
  13. }
  14. public Integer poll(){
  15. Integer re=null;
  16. if(!stack2.empty()){
  17. re=stack2.pop();
  18. }else{
  19. while(!stack1.empty()){//move to stack2 to make stack1 have only one element.Then pop this element.
  20. re=stack1.pop();
  21. stack2.push(re);
  22. }
  23. if(!stack2.empty()){
  24. re=stack2.pop();
  25. }
  26. }
  27. return re;
  28. }
  29. public Integer offer(int o){
  30. stack1.push(o);
  31. return o;
  32. }
  33. public static void main(String[] args) {
  34. QueueImplementByTwoStacks queue=new QueueImplementByTwoStacks();
  35. List<Integer> re=new ArrayList<Integer>();
  36. queue.offer(1);
  37. queue.offer(2);
  38. queue.offer(3);
  39. re.add(queue.poll());
  40. queue.offer(4);
  41. re.add(queue.poll());
  42. queue.offer(5);
  43. re.add(queue.poll());
  44. re.add(queue.poll());
  45. re.add(queue.poll());
  46. System.out.println(re.toString());
  47. }
  48. }
import java.util.ArrayList;
import java.util.List;
import java.util.Stack;

	/*
	 * Q 57 用两个栈实现队列
	 */

public class QueueImplementByTwoStacks {

	private Stack<Integer> stack1;
	private Stack<Integer> stack2;

	QueueImplementByTwoStacks(){
		stack1=new Stack<Integer>();
		stack2=new Stack<Integer>();
	}

	public Integer poll(){
		Integer re=null;
		if(!stack2.empty()){
			re=stack2.pop();
		}else{
			while(!stack1.empty()){//move to stack2 to make stack1 have only one element.Then pop this element.
				re=stack1.pop();
				stack2.push(re);
			}
			if(!stack2.empty()){
				re=stack2.pop();
			}
		}
		return re;
	}
	public Integer offer(int o){
		stack1.push(o);
		return o;
	}

	public static void main(String[] args) {
		QueueImplementByTwoStacks queue=new QueueImplementByTwoStacks();
		List<Integer> re=new ArrayList<Integer>();
		queue.offer(1);
		queue.offer(2);
		queue.offer(3);
		re.add(queue.poll());
		queue.offer(4);
		re.add(queue.poll());
		queue.offer(5);
		re.add(queue.poll());
		re.add(queue.poll());
		re.add(queue.poll());
		System.out.println(re.toString());
	}

}

Java代码  

    1. import java.util.LinkedList;
    2. /*
    3. * Q 57 用两个队列实现一个栈
    4. */
    5. public class StackImplementByTwoQueues {
    6. //use ‘queue1‘ and ‘queue2‘ as a queue.That means only use the method ‘addLast‘ and ‘removeFirst‘.
    7. private LinkedList<Integer> queue1;
    8. private LinkedList<Integer> queue2;
    9. StackImplementByTwoQueues(){
    10. queue1=new LinkedList<Integer>();
    11. queue2=new LinkedList<Integer>();
    12. }
    13. public Integer pop(){
    14. Integer re=null;
    15. if(queue1.size()==0&&queue2.size()==0){
    16. return null;
    17. }
    18. if(queue2.size()==0){
    19. while(queue1.size()>0){
    20. re=queue1.removeFirst();
    21. if(queue1.size()!=0){//do not add the last element of queue1 to queue2
    22. queue2.addLast(re);
    23. }
    24. }
    25. }else if (queue1.size()==0){
    26. while(queue2.size()>0){
    27. re=queue2.removeFirst();
    28. if(queue2.size()!=0){//do not add the last element of queue2 to queue1
    29. queue1.addLast(re);
    30. }
    31. }
    32. }
    33. return re;
    34. }
    35. public Integer push(Integer o){
    36. if(queue1.size()==0&&queue2.size()==0){
    37. queue1.addLast(o);//queue2.addLast(o); is also ok
    38. }
    39. if(queue1.size()!=0){
    40. queue1.addLast(o);
    41. }else if(queue2.size()!=0){
    42. queue2.addLast(o);
    43. }
    44. return o;
    45. }
    46. public static void main(String[] args) {
    47. StackImplementByTwoQueues stack=new StackImplementByTwoQueues();
    48. int tmp=0;
    49. stack.push(1);
    50. stack.push(2);
    51. stack.push(3);
    52. tmp=stack.pop();
    53. System.out.println(tmp);//3
    54. stack.push(4);
    55. tmp=stack.pop();
    56. System.out.println(tmp);//4
    57. tmp=stack.pop();
    58. System.out.println(tmp);//2
    59. stack.push(5);
    60. stack.push(6);
    61. tmp=stack.pop();
    62. System.out.println(tmp);//6
    63. tmp=stack.pop();
    64. System.out.println(tmp);//5
    65. tmp=stack.pop();
    66. System.out.println(tmp);//1
    67. }
    68. }
时间: 2024-11-16 04:01:20

java-57-用两个栈实现队列&&用两个队列实现一个栈的相关文章

Algorithm --&gt; 两个栈实现队列和两个队列实现栈

两个栈实现队列和两个队列实现栈 队列(queue)先进先出的线性表:栈(stack)先进后出的线性表. 两个栈实现队列 法一思路: s1是入栈的,s2是出栈的. 入队列:直接压入s1即可: 出队列:如果s2不为空,把s2中的栈顶元素直接弹出:否则,把s1的所有元素全部弹出压入s2中,再弹出s2的栈顶元素. 代码: #include <stack> #include <iostream> #include <cassert> using namespace std; te

用有限个栈模拟常数效率操作的队列

问题来源 写这篇博客来源于一次面试的经历.不过并不是我被面试,而是我面试别人.如何用两个栈实现一个队列?这算是一个经典的面试题.因为它经常被拿来用.如果对栈和队列比较掌握的人,就可以轻松的答出来. 然而,那天坐在对面的面试者直接抛出:如何用有限个栈模拟常数效率操作的队列呢?作为一个面试官,我佯装镇定,因为这个和用栈实现队列可是一个天上一个地下的区别.听他说完.之后几个小时的面试,我根本无心面试,脑子里一直在想:他刚才说了啥?到底是怎么操作的?太优秀了! 看完这篇文章,以后面试别人或者被面试的过程

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

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

两个栈实现一个队列以及两个队列实现一个栈(Java)

两个栈实现一个队列 import java.util.Stack; public class Demo07 { Stack<Integer> stack1 = new Stack<Integer>(); Stack<Integer> stack2 = new Stack<Integer>(); public void push(int node) { stack1.push(node); } public int pop() { if(stack2.size

(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 us

两个栈模拟一个队列和两个队列模拟一个栈

此为网易的一道笔试题.到时候秀逗,不知所云.后来研究之后记录下,以备以后经常翻阅. 栈:先进后出 push和pop 队列:先进先出 offer和poll (1)两个栈模拟一个队列 即将先进后出实现先进先出.比较容易理解,只要所有数据先往一个栈里push,然后将该栈中的数据依次pop出来再push进第二个队列,则顺序自然颠倒过来了,则每次pop是从第二个队列中取数据. import java.util.*; public class StackQueue{ private Stack<Intege

使用两个队列模拟一个栈

准备笔试,在看相关知识,看到这个问题,如何使用两个队列模拟一个栈,在参考了相关知识下,实现了代码如下: 1 public class Stack<E>{ 2 Queue<E> q1 = null; //队列q1提供压栈功能, 3 Queue<E> q2 = null; //队列q2提供弹栈功能 4 5 public Stack(){ 6 q1 = new LinkedList<E>(); 7 q2 = new LinkedList<E>(); 8

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

面试中常出现让你手写两个队列实现一个栈,两个栈实现一个队列的问题,很是头疼!今天就仔细将我分析,思考过的Java代码给大家分享一下:(一)两个队列实现一个栈: 两个队列添加元素,哪个队列为空,由于在输出元素时,要进行相应元素的移动(除去尾部元素),所以要在对应不为空的队列进行元素的添加:在输出数据时,要进行两个队列的变相操作,不为空的队列要依次向为空的队列中添加元素,直到尾元素输出即可! /** * 两个队列实现一个栈 * @auther yangchao * @date 2019/7/18 *

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

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