`

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

 
阅读更多
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());
	}

}



import java.util.LinkedList;

	/*
	 * Q 57 用两个队列实现一个栈
	 */
public class StackImplementByTwoQueues {

	//use 'queue1' and 'queue2' as a queue.That means only use the method 'addLast' and 'removeFirst'.
	private LinkedList<Integer> queue1;
	private LinkedList<Integer> queue2;
	
	StackImplementByTwoQueues(){
		queue1=new LinkedList<Integer>();
		queue2=new LinkedList<Integer>();
	}
	
	public Integer pop(){
		Integer re=null;
		if(queue1.size()==0&&queue2.size()==0){
			return null;
		}
		if(queue2.size()==0){
			while(queue1.size()>0){
				re=queue1.removeFirst();
				if(queue1.size()!=0){//do not add the last element of queue1 to queue2
					queue2.addLast(re);
				}
			}
		}else if (queue1.size()==0){
			while(queue2.size()>0){
				re=queue2.removeFirst();
				if(queue2.size()!=0){//do not add the last element of queue2 to queue1
					queue1.addLast(re);
				}
			}
		}
		return re;
	}
	public Integer push(Integer o){
		if(queue1.size()==0&&queue2.size()==0){
			queue1.addLast(o);//queue2.addLast(o); is also ok
		}
		if(queue1.size()!=0){
			queue1.addLast(o);
		}else if(queue2.size()!=0){
			queue2.addLast(o);
		}
		return o;
	}
	
	public static void main(String[] args) {
		StackImplementByTwoQueues stack=new StackImplementByTwoQueues();
		int tmp=0;
		stack.push(1);
		stack.push(2);
		stack.push(3);
		tmp=stack.pop();
		System.out.println(tmp);//3
		stack.push(4);
		tmp=stack.pop();
		System.out.println(tmp);//4
		tmp=stack.pop();
		System.out.println(tmp);//2
		stack.push(5);
		stack.push(6);
		tmp=stack.pop();
		System.out.println(tmp);//6
		tmp=stack.pop();
		System.out.println(tmp);//5
		tmp=stack.pop();
		System.out.println(tmp);//1
	}
}

2
0
分享到:
评论
2 楼 bylijinnan 2015-07-03  
sand_clock 写道
楼主代码有误:

两个队列实现一个栈
第一次push时你的代码会让第一个元素进栈2遍。
错误代码:
public Integer push(Integer o){ 
        if(queue1.size()==0&&queue2.size()==0){ 
            queue1.addLast(o);//queue2.addLast(o); is also ok 
        } 
        if(queue1.size()!=0){ 
            queue1.addLast(o); 
        }else if(queue2.size()!=0){ 
            queue2.addLast(o); 
        } 
        return o; 

纠正代码:
public Integer push(Integer o){ 
        if(queue1.size()!=0){ 
            queue1.addLast(o); 
        }else if(queue2.size()!=0){ 
            queue2.addLast(o); 
        } 
        if(queue1.size()==0&&queue2.size()==0){ 
            queue1.addLast(o);//queue2.addLast(o); is also ok 
        } 
        return o; 

不会啊,不会存在两个queue都不为空的情况
1 楼 sand_clock 2015-07-02  
楼主代码有误:

两个队列实现一个栈
第一次push时你的代码会让第一个元素进栈2遍。
错误代码:
public Integer push(Integer o){ 
        if(queue1.size()==0&&queue2.size()==0){ 
            queue1.addLast(o);//queue2.addLast(o); is also ok 
        } 
        if(queue1.size()!=0){ 
            queue1.addLast(o); 
        }else if(queue2.size()!=0){ 
            queue2.addLast(o); 
        } 
        return o; 

纠正代码:
public Integer push(Integer o){ 
        if(queue1.size()!=0){ 
            queue1.addLast(o); 
        }else if(queue2.size()!=0){ 
            queue2.addLast(o); 
        } 
        if(queue1.size()==0&&queue2.size()==0){ 
            queue1.addLast(o);//queue2.addLast(o); is also ok 
        } 
        return o; 

相关推荐

    华科java实验-用泛型栈实现泛型队列

    试用java.util.Stack泛型栈作为父类,用另一个泛型栈对象作为成员变量,模拟实现一个泛型子类Queue,当存储元素的第1个栈的元素超过dump时,再有元素入队列就倒入第2栈。除提供无参构造函数Queue( )外,其它所有队列...

    shushu1234#articles-backup#2018-04-13-剑指Offer-用两个栈实现队列1

    title: 剑指Offer-用两个栈实现队列subtitle: 用两个栈实现队列categories: 剑指Offer用两个栈实现队列题目描述用两个栈来实现一

    java代码-200606-用两个栈实现队列_java

    在Java编程中,使用两个栈实现队列是一种常见的数据结构问题。这个题目要求我们通过两个栈来模拟队列的基本操作,如入队(enqueue)和出队(dequeue)。栈和队列是两种不同的数据结构,栈是后进先出(LIFO,Last In ...

    Veal98#CS-Wiki#232-用两个栈实现队列1

    232. 用两个栈实现队列232. 用栈实现队列题目描述解题思路/** Initialize your data structure here. *//** R

    java基础面试题用两个栈实现一个队列

    java基础面试题用两个栈实现一个队列本资源系百度网盘分享地址

    利用栈和队列实现迷宫

    "利用栈和队列实现迷宫" 通过栈和队列两种不同的方法来实现迷宫问题。...通过栈和队列两种方法来解决迷宫问题,我们可以学习到数据结构的应用和算法的设计,以及如何使用不同的方法来解决同一个问题。

    栈和队列源代码

    在Java中,可以使用ArrayList或者LinkedList来实现栈。当一个元素被压入栈(push)时,它成为栈顶元素;当一个元素被弹出(pop)时,总是栈顶元素被移除。栈的主要操作还包括查看栈顶元素但不移除(peek)以及检查栈...

    ZhuoZhuoCrayon#CS-Notes#9. 用两个栈实现队列1

    9. 用两个栈实现队列题目链接牛客网题目描述用两个栈来实现一个队列,完成队列的 Push 和 Pop 操作。当元素要出栈时,需要先进入 out 栈,此时元素出栈

    java-leetcode面试题解Stack之第232题用栈实现队列-题解.zip

    在第232题中,我们需要使用两个栈来模拟一个队列的行为。这个问题的关键在于如何利用栈的特性来实现队列的两个主要操作:入队(enqueue)和出队(dequeue)。 1. 入队(enqueue)操作:将新元素直接压入栈1。这个...

    553899811#NewBie-Plan#5.用两个栈实现一个队列1

    5.用两个栈实现一个队列题目描述用两个栈来实现一个队列,完成队列的Push和Pop操作。* @desc 用两个栈实现队列public class Solutio

    数据结构--表、栈、队列(java)

    - **计算**:基于后缀表达式进行计算,通常使用两个栈:一个存放运算符,另一个存放数值。按照后缀表达式的顺序,逐个处理每个字符,进行相应的计算。 例如,对于中缀表达式“4 + 2 * (1 - 5) ^ 2 ^ 3”,其对应的...

    java 栈和队列的小例子

    在Java中,我们可以使用ArrayDeque类或者Stack类来实现栈。ArrayDeque相比于Stack性能更优,因为它提供了线程不安全但高效的操作。以下是一个简单的栈操作例子: ```java import java.util.Stack; public class ...

    栈和队列的基本操作实现及其应用实验报告

    1. **熟练掌握栈和队列的基本操作**:在数组和链表两种存储结构上实现栈和队列的基本操作。 2. **应用栈和队列解决实际问题**:通过具体的编程练习,学习如何利用栈和队列来解决简单的实际问题。 #### 实验内容 本...

    数据结构用两个栈实现一个队列的实例

    "数据结构用两个栈实现一个队列的实例" 本文主要介绍了使用两个栈来实现一个队列的实例,这是数据结构中的一种常见实现方法。队列是一种先进先出(FIFO)的数据结构,栈是一种先进后出(LIFO)的数据结构。通过使用...

    【剑指offer】面试题9-用两个栈实现队列-完整的可执行代码(Java)

    题目描述: 用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。 解题思路参考:https://blog.csdn.net/flower_48237/article/details/104055970

    如何使用两个栈实现队列Java

    本篇文章将深入探讨如何使用两个栈来实现一个队列,并在Java语言中给出具体实现。 首先,我们要理解为何可以使用两个栈来模拟队列的行为。栈1作为辅助栈,用于临时存储数据,而栈2作为主栈,用于模拟队列的出队操作...

    通过2个栈 模拟队列。

    这样,我们就成功地使用两个栈模拟了一个队列。 这种设计虽然增加了额外的转移操作,但在某些情况下,比如当内存限制或特定环境限制只允许使用栈时,它提供了一种灵活的解决方案。通过理解这种转换,我们可以更好地...

    用栈实现队列(java代码).docx

    ### 使用两个栈实现队列(Java代码) #### 一、问题背景 在计算机科学中,队列是一种重要的数据结构,遵循先进先出(FIFO)原则。而在实际应用中,有时候我们可能没有现成的队列类或者接口可用,这时就需要通过...

    java 栈的实现和应用

    2. **Stack类**:Java标准库中的`java.util.Stack`类也是实现栈的一个选项。它是`Vector`类的子类,因此具有线程安全的特性。但通常,由于其性能较低,推荐使用`ArrayDeque`。使用`Stack`类的示例如下: ```java ...

    剑指offer 计划1(栈与队列)---java(csdn)————程序.pdf

    剑指Offer中的第9题提出了一个用两个栈实现队列的问题。这个问题的核心在于利用栈的特性模拟队列的行为。通常情况下,栈不支持在中间位置进行删除操作,但可以通过以下步骤实现队列功能: 1. 添加元素到队列尾部...

Global site tag (gtag.js) - Google Analytics