剑指offer(9)——用两个栈实现队列
题目:
用两个栈实现一个队列。队列的声明如下,请实现它的两个函数appendTail和deleteHead,分别完成在队列尾部插入结点和在队列头部删除结点的功能。
思路:
首先定义两个栈stack1、stack2,stack1用于插入,stack2用于删除。删除时如果直接出栈就无法实现先进先出,这时需要将stack1中的所有元素从stack1出栈,然后依次压入stack2中,然后再从stack2中出栈。如果stack2中有元素存在,那么直接出栈,无需将stack1中元素压入stack2中。只有当stack2中元素都为空时,才需要将stack1中元素取出。
代码:
import java.util.Stack; /** * 两个栈实现队列 * @author wydream * */ public class TwoStackQueue { private Stack<Object> s1;//s1插入元素 private Stack<Object> s2;//s2删除元素 public TwoStackQueue() { s1=new Stack<Object>(); s2=new Stack<Object>(); } //插入元素 public void push(Object obj) { s1.push(obj); } //元素出队列 public Object pop() { if(s2.empty()&&s1.empty()) { return null; } if(s2.empty()) { System.out.println("s1中数据进入到s2"); while(!s1.empty()) { Object obj=s1.pop(); s2.push(obj); } } return s2.pop(); } public static void main(String[] args) { TwoStackQueue tq=new TwoStackQueue(); tq.push("北京"); tq.push("上海"); tq.push("深圳"); tq.push("杭州"); System.out.println(tq.pop()); System.out.println(tq.pop()); System.out.println(tq.pop()); tq.push("武汉"); System.out.println(tq.pop()); System.out.println(tq.pop()); } }
相关题目——两个队列实现栈:
import java.util.LinkedList; import java.util.Queue; /** * 两个队列实现栈 * * @author wydream * */ public class TwoQueueStack { private Queue<String> queue1=new LinkedList<String>(); private Queue<String> queue2=new LinkedList<String>(); //向栈中压入元素 public void push(String value) { //两个队列都为空时,优先考虑queue1 if(queue1.isEmpty()&&queue2.isEmpty()) { queue1.add(value); return; } //如果queue1为空,queue2中有数据,则直接放入queue2中 if(queue1.isEmpty()) { queue2.add(value); return; } //如果queue2为空,queue1有数据,直接放入queue1中 if(queue2.isEmpty()) { queue1.add(value); return; } } //从栈中弹出一个数据 public String pop() { //两个栈都为空 if(queue1.isEmpty()&&queue2.isEmpty()) { System.out.println("栈为空"); return null; } //如果queue1中没有元素,queue2中有元素,将其queue2中的元素依次放入queue1中,直到最后一个元素,弹出即可 if(queue1.isEmpty()) { while(queue2.size()>1) { queue1.add(queue2.poll()); } return queue2.poll(); } //如果queue2中没有元素,queue1中有元素,将其queue1中的元素依次放入queue2中,直到最后一个元素,弹出即可 if(queue2.isEmpty()) { while(queue1.size()>1) { queue2.add(queue1.poll()); } return queue1.poll(); } return null; } public static void main(String[] args) { TwoQueueStack ts=new TwoQueueStack(); ts.push("北京"); ts.push("上海"); ts.push("广州"); ts.push("深圳"); System.out.println(ts.pop()); System.out.println(ts.pop()); ts.push("苏州"); ts.push("杭州"); System.out.println(ts.pop()); System.out.println(ts.pop()); } }
剑指offer(9)——用两个栈实现队列的更多相关文章
- 《剑指offer》用两个栈实现队列
本题来自<剑指offer> 用两个栈实现队列 题目: 用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. 思路: 队列定义:先进先出 栈定义:先进后出 要 ...
- 剑指 Offer 09. 用两个栈实现队列
剑指 Offer 09. 用两个栈实现队列 用两个栈实现一个队列.队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的 ...
- [Leetcode]225. 用队列实现栈 、剑指 Offer 09. 用两个栈实现队列
##225. 用队列实现栈 如题 ###题解 在push时候搞点事情:push时入队1,在把队2的元素一个个入队1,再交换队2和队1,保持队1除pushguocheng 始终为空. ###代码 cla ...
- 剑指 Offer 09. 用两个栈实现队列 +java中栈和队列的使用
剑指 Offer 09. 用两个栈实现队列 题目链接 class CQueue { private Stack<Integer> sta1; private Stack<Intege ...
- 力扣 - 剑指 Offer 09. 用两个栈实现队列
目录 题目 思路 代码 复杂度分析 题目 剑指 Offer 09. 用两个栈实现队列 思路 刚开始想的是用stack1作为数据存储的地方,stack2用来作为辅助栈,如果添加元素直接push入stac ...
- 菜鸟刷题路:剑指 Offer 09. 用两个栈实现队列
剑指 Offer 09. 用两个栈实现队列 用两个栈实现一个队列.队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的 ...
- 【Java】 剑指offer(8) 用两个栈实现队列
本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集 题目 用两个栈实现一个队列.队列的声明如下,请实现它的两个函数append ...
- [剑指offer]09用两个栈实现队列插入和删除操作,C++实现
原创博文,转载请注明出处! # 本文为牛客网<剑指offer>刷题笔记 1.题目 # 用两个栈实现队列的插入和删除操作 2.思路 栈服从先入后出的原则处理数据,队列服从先入先出的原则处理数 ...
- Go语言实现:【剑指offer】用两个栈实现队列
该题目来源于牛客网<剑指offer>专题. 用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. Go语言实现: var list1 = list.New( ...
- 剑指OFFER之用两个栈实现队列(九度OJ1512)
题目描述: 用两个栈来实现一个队列,完成队列的Push和Pop操作.队列中的元素为int类型. 输入: 每个输入文件包含一个测试样例.对于每个测试样例,第一行输入一个n(1<=n<=100 ...
随机推荐
- IDEA的版本控制
参考:https://blog.csdn.net/qq_35246620/article/details/70792861 1.从远程仓库下载项目 2.提交项目到远程仓库
- Linux 系统配置IPv6
1.自动获取IPV6地址 1)修改/etc/sysconfig/network文件,修改如下字段,不存在则手动添加,部分系统默认是开启的NETWORKING_IPV6=yes 2)修改/etc/sys ...
- T-MAX——项目需求分析
这个作业属于哪个课程 2019秋福大软件工程实践Z班 这个作业要求在哪里 团队作业第二次-需求规格说明书 团队名称 T-MAX 这个作业的目标 撰写项目需求规格说明书,介绍团队分工 作业正文 T-MA ...
- spring (反射+代理+DI+AOP)
spring https://baijiahao.baidu.com/s?id=1620606848227713760&wfr=spider&for=pc 反射 https://bl ...
- Java并发包线程池之ForkJoinPool即ForkJoin框架(一)
前言 这是Java并发包提供的最后一个线程池实现,也是最复杂的一个线程池.针对这一部分的代码太复杂,由于目前理解有限,只做简单介绍.通常大家说的Fork/Join框架其实就是指由ForkJoinPoo ...
- Canvas的flag具体的含义
示例代码: package com.loaderman.customviewdemo; import android.content.Context; import android.graphics. ...
- SIT测试 和 UAT测试
在企业级软件的测试过程中,经常会划分为三个阶段——单元测试,SIT和UAT,如果开发人员足够,通常还会在SIT之前引入代码审查机制(Code Review)来保证软件符合客户需求且流程正确.下面简单介 ...
- Vue+MySQL实现购物车的增删改查
1,创建简单数据库数据表 2,创建Mapper文件 <!--查询商品--> <select id="selectcommodity" resultType=&qu ...
- iOS 点击空白处收回键盘的几个简单代码
//收回键盘1 -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { [self.view.subviews enumer ...
- 利用Python获取cookie的方法,相比java代码简便不少
1.通过urllib库,是python的标准库,不需要另外引入,直接看代码,注意代码的缩进: # coding=UTF-8import cookielibimport urllib2 class Ry ...