剑指offer面试题7——用两个栈实现队列

package offer7;

import common.Stack;

/**
 * 用两个栈实现一个队列
 * @author chibozhou
 */
public class Queue<T> {
	//队列当前大小
	private int curSize;
	//队列最大容量
	private int maxSize;
	//两个栈
	private Stack<T> stack1;
	private Stack<T> stack2;
	
	
	/**
	 * 初始化队列
	 * @param maxSize 设置最大容量
	 */
	public Queue(int maxSize){
		//健壮性判断
		if(maxSize<=0){
			System.out.println("队列大小不能小于1");
			return;
		}
		
		//初始化栈
		stack1 = new Stack<T>(maxSize);
		stack2 = new Stack<T>(maxSize);
		this.maxSize = maxSize;
	}
	
	
	
	/**
	 * 入队 
	 * @param obj 入队的元素
	 */
	public boolean push(T obj){
		//健壮性判断
		if(obj==null){
			System.out.println("入队元素不能为空!");
			return false;
		}
		
		//队已满
		if(stack1.getCurSize()>=maxSize){
			System.out.println("队以满!");
			return false;
		}
		
		//入队
		stack1.push(obj);
		curSize++;
		return true;
	}
	
	
	
	/**
	 * 出队
	 */
	public T pop(){
		//对为空
		if(curSize==0){
			System.out.println("队为空!");
			return null;
		}
		
		//将stack1中的所有元素转移到stack2中,再从stack2栈顶取元素即可
		while(stack1.getCurSize()>0){
			stack2.push(stack1.pop());
		}
		return stack2.pop();
	}
	
	
	
	/**
	 * 打印队列
	 */
	@Override
	public String toString() {
		System.out.println("Queue---maxSize:"+maxSize+"---curSize:"+curSize+"------");
		//队列为空
		if(curSize==0){
			System.out.println("队列为空");
			return null;
		}
		
		//若数据都在stack1中,则转到stack2中
		if(stack1.getCurSize()>=0){
			while(stack1.getCurSize()>0){
				stack2.push(stack1.pop());
			}
		}
		
		//打印stack2中的元素
		for(int i=0;i<stack2.getCurSize();i++){
			System.out.println(stack2.top());
		}
		System.out.println("Queue--------------------------------------------------");
		return null;
	}


}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏linux驱动个人学习

ALSA声卡驱动的DAPM(二)-建立过程

在上一篇文章中,我们重点介绍了widget、path、route之间的关系及其widget的注册; http://www.cnblogs.com/linhaos...

3324
来自专栏安恒网络空间安全讲武堂

[Web安全]PHP伪协议

[Web安全]PHP伪协议 最近php伪协议的各种神奇妙用好像突然又常常提到了,php中支持的伪协议有下面这么多 复制代码 file:// — 访问本地文件...

2218
来自专栏前端小吉米

async/await 一种非常丝滑的异步语法

1363
来自专栏码匠的流水账

使用prettyTime格式化时间

社交网站经常会显示几分钟前,几个小时前之类的时间,java里头有个prettyTime的类库可以用来做这样的转换,这里介绍一下。

151
来自专栏小尘哥的专栏

thymeleaf全局常量定义

目测应该是重写这货就可以了,talk is cheap,show me the code

541
来自专栏菩提树下的杨过

温故而知新:Delegate,Action,Func,匿名方法,匿名委托,事件

一、委托Delegate 一般的方法(Method)中,我们的参数总是string,int,DateTime...这些基本的数据类型(或者没有参数),比如 p...

1706
来自专栏快乐八哥

表单验证和正则表达式

第一部分:form表单基础 表单验证使用onblur还是onchange. JavaScript中的正则表达式 提示:在JavaScript代码中,函数需要传入...

1795
来自专栏C#中的VList数据结构

VList data structures in C#

VLIST数据结构是由Phil Bagwell设计的,它作为在函数式编程语言单链表的替代品。它可以被认为是链接列表和动态数组(如.NET Framework的L...

3247
来自专栏偏前端工程师的驿站

前端魔法堂——异常不仅仅是try/catch

1103
来自专栏性能与架构

console.log() 之外的调试技巧

console.log( ) 是JS开发时常用的小工具,输出一些信息来辅助调试,console 还有很多有用的方法,下面介绍几个方便调试的用法 跟踪堆栈 例如想...

3279

扫描关注云+社区