• 两个栈实现队列+两个队列实现栈----java


                                               两个栈实现队列+两个队列实现栈----java

    一.两个栈实现一个队列

    思路:所有元素进stack1,然后所有出stack1并进入stack2.实现队列的先进先出即:若stack2非空,我们须要的恰好再栈顶,出栈;若要给队列加入元素,即先进sack1,要出队时,若stack2不为空就出栈,为空时就把stack1所有进栈到stack2

    package com.sheepmu;
    
    import java.util.Stack;
    
    public class StacksToQueue 
    {
    	 Stack<Integer> stack1=new Stack<Integer>() ;
    	 Stack<Integer> stack2=new Stack<Integer>();
    	 public void addToTail(int x)//加入元素到队尾   --进队---
    	 {
    		 stack1.push(x);
    		 
    	 }
    	 public int deleteHead()//删除对首      --出队---    不需是队不为空才干删除呀~~~~
    	 {
    		 if( pSize()!=0)//队列不为空
    		 {
    			 if(stack2.isEmpty())//若stack2为空,则把stack1所有加入stack2
    				 stack1ToStack2(); 
    			 return  stack2.pop();
    			 
    		 }
    		 else
    		 {
    			 System.out.println("队列已经为空,不能运行从队头出队");
    			 return -1;
    		 }
    		 
    	 }
    	 
    	 public void stack1ToStack2()//把stack1所有放入stack2
    	 {
    		 while(!stack1.isEmpty()) 
    			 stack2.push(stack1.pop());
    	 }
    	 
    	 public int pSize()//队列size()
    	 {
    		 return  stack1.size()+stack2.size();//两个都为空队列才是空
    	 }
    	 
    	 public static void main(String[] args)
    	 {
    		 StacksToQueue  q=new StacksToQueue ();
    		 q.addToTail(1);
    		 q.addToTail(2);
    		 q.addToTail(3);
    		 q.addToTail(4);
    		 System.out.println(q.deleteHead());
    		 System.out.println(q.deleteHead());
    		 q.addToTail(5);
    		 System.out.println(q.deleteHead());
    		 System.out.println(q.deleteHead());
    		 System.out.println(q.deleteHead());
    		 System.out.println(q.deleteHead());
    	 }
    }

    输出:

    1
    2
    3
    4
    5
    队列已经为空,不能运行从队头出队
    -1

    二.两个队列实现一个栈

    思路:全部元素进入q1,由于我们的目的是栈,也就是最先出c,儿队是从队头開始出,全部先把ab出q1并入q2,此时目标c跑到了队头,出q1。此时q1已经为空,下一个要出的是b,把a从q2出队并进q1,此时目标b在q2队头,出队........

    即:把非空队列的n-1个压人空对列,剩的第n个出队...即总有一个队列为空。


    ps:图片原创于剑桥offer,来自网络

    package com.sheepmu;
    
    import java.util.LinkedList;
    
    public class QueuesToStack 
    {
    	LinkedList<Integer> queue1=new LinkedList<Integer>();
    	LinkedList<Integer> queue2=new LinkedList<Integer>();
    	public void push(int value)//入栈
    	{
    		queue1.addLast(value);
    		
    	}
    	
    	public int pop()//出栈     必须是非空的栈才干出栈啊
    	{
    		if(sSize()!=0)//栈不为空
    		{
    			//移动一个队的n-1个到还有一个中
    			if(!queue1.isEmpty())//q1 空
    			{
    				putN_1ToAnthor();
    				return queue1.removeFirst();
    			}
    			else  //q2 空
    			{
    				putN_1ToAnthor();
    				return queue2.removeFirst();
    			}		 
    		}
    		else
    		{
    			System.out.println("栈已经为空啦,不能出栈");
    			return -1;
    		}
    		
    	}
    	
    	public int sSize()
    	{
    		return queue1.size()+queue2.size();
    	}
    	
    	public void putN_1ToAnthor()//从非空中出队n-1个到还有一个队列   由于队列总是一空一非空
    	{
    		if(!queue1.isEmpty())
    		{
    			while(queue1.size()>1)
    			{
    				queue2.addLast(queue1.removeFirst());
    			}
    		}
    		else if(!queue2.isEmpty())
    		{
    			while(queue2.size()>1)
    			{
    				queue1.addLast(queue2.removeFirst());
    			}
    		}
    	}
    	public static void main(String[] args)
    	{
    		QueuesToStack stack=new QueuesToStack();
    		stack.push(1);
    		stack.push(2);
    		stack.push(3);
    		stack.push(4);
    		System.out.println(stack.pop());
    		System.out.println(stack.pop());
    		stack.push(5);
    		stack.push(6);
    		System.out.println(stack.pop());
    		System.out.println(stack.pop());
    		System.out.println(stack.pop());
    		System.out.println(stack.pop());
    		System.out.println(stack.pop());
    	}
    }
    
    输出:

    4
    3
    6
    5
    2
    1
    栈已经为空啦,不能出栈
    -1


  • 相关阅读:
    iphone开发 使用TouchJSON框架 解析JSON
    iphone开发UIScrollView控件详解
    iPhone UIAlertView属性及使用方法
    vim文本编辑器使用大全 命令的解读
    iphone开发软件Xcode3.2.6破解免证书真机开发调试方案
    Objectivec语言 字符串类NSMutableString用法
    iphone开发 如何在NSMutableDictionary中放入基本数据类型
    找了很久,终于让我找到了,登陆界面登陆按钮随着输入法键盘的弹出而动态改变
    微软安全指南中心:Windows 2000
    在网络中安装、配置和使用SUS服务
  • 原文地址:https://www.cnblogs.com/mfrbuaa/p/3902804.html
Copyright © 2020-2023  润新知