• 2018.9.5 Java中使用栈来模拟队列


    栈的规律是是先进后出 队列的规律是先进先出

    栈模拟队列

    首先我们定义两个栈,一个放数据,一个出数据,判断B栈是否有元素,有元素则直接pop;没有元素则需要我们将A里面的元素出栈然后放到B里面,再取出,即实现队列的先进先出

    最初思路想法

        使用A和B两个栈来模拟队列,一个为入栈一个为出栈,这样来实现队列
    
        两个栈stack1,stack2 入队在stack2.如果入队时stack2 不为空,那么stack2必须先清空(数据迁移到stack1 ),如果出对时stack2不为空,直接出栈。如果stack2为空,则需要把stack1中的数据全部转移到stack2中
       
    

    修正后思路想法

    利用两个栈S1和S2来模拟一个队列,当需要向队列中插入一个元素时,用S1来存放已经输入的元素,即S1执行入栈操作,当需要出队时,则对S2执行出栈操作。由于从栈中取出元素的顺序是原顺序的逆序,所以先将S1的所有元素全部出栈并入栈到S2中,再在S2中齿形出栈操作,就能实现出队操作,而在执行此操作之前,先判断S2是否为空,否则会导致顺序混乱,当栈S1和S2都为空时队列为空。
    

    代码实现

    
    import java.util.Stack;
    
    /**
     * 使用两个栈来模拟队列
     * @author legend
     * @param <E>
     *
     */
    public class MyQueue<E> {
    	/**
    	 * 使用Java类库里面的stack定义两个栈  一个用于出栈一个用于入栈
    	 */
    	private Stack<E> stack = new Stack<E>();
    	private Stack<E> stack2 = new Stack<E>();
    	
    	/**
    	 * 入栈和出栈是为了增加线程安全  使用了同步
    	 */
    	public synchronized void put(E data) {
    		stack.push(data);
    	}
    	
    	
    	public synchronized E pop() {
    		//如果栈2为空,则把栈1里面的数据压到2里面,在出栈,即实现队列  若不为空,那么stack2中元素弹出(出列),若为空则提示队列为空
    		if(stack2.isEmpty()) {
    			while(!stack.isEmpty()) {
    				stack2.push(stack.pop());
    				return stack2.pop();
    			}
    		}
    		//否则直接出栈,实现栈对模拟队列
    		return stack2.pop();
    	}
    	
    	public static void main(String[] args) {
    		
    		MyQueue<Integer> myQueue = new MyQueue<Integer>();
    		
    		myQueue.put(1);//第一元素
    		myQueue.put(2);//第二元素
    		myQueue.put(3);//第三元素
    		
    		System.out.println("栈模拟队列后head的数据"+myQueue.pop());
    	}
    }
    
    
    

    2,队列模拟栈

    
    两个队列q1,q2
    
    入栈在q1,。q2作为一个缓冲队列。
    
    出栈时,将q1除最后一个外,全部入队列q2。q1出队即是出栈。
    
    
  • 相关阅读:
    《代码大全2》阅读笔记03
    第一阶段意见评论
    大二下学期学习进度(十一)
    四叶草社交平台——十天冲刺(10)
    四叶草社交平台——十天冲刺(9)
    四叶草社交平台——十天冲刺(8)
    四叶草社交平台——十天冲刺(7)
    四叶草社交平台——十天冲刺(6)
    四叶草社交平台——十天冲刺(5)
    四叶草社交平台——十天冲刺(4)
  • 原文地址:https://www.cnblogs.com/qichunlin/p/9590332.html
Copyright © 2020-2023  润新知