两个栈实现队列+两个队列实现栈----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
两个栈实现队列+两个队列实现栈----java的更多相关文章
- 二、 编写一个类,用两个栈实现队列,支持队列的基本操作(add,poll,peek)
请指教交流! package com.it.hxs.c01; import java.util.Stack; /* 编写一个类,用两个栈实现队列,支持队列的基本操作(add,poll,peek) */ ...
- 算法:用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。
算法:用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型.<剑指offer> 利用栈来进行操作,代码注释写的比较清楚:首先判断两个栈是否是空的:其次当栈二 ...
- 面试题9-用两个栈来实现一个队列,完成队列的Push和Pop操作
题目 用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. 思路: 一个栈压入元素,而另一个栈作为缓冲,将栈1的元素出栈后压入栈2中 代码 import java.ut ...
- [剑指offer] 5. 用两个栈实现队列+[剑指offer]30. 包含min函数的栈(等同于leetcode155) +[剑指offer]31.栈的压入、弹出序列 (队列 栈)
c++里面stack,queue的pop都是没有返回值的, vector的pop_back()也没有返回值. 思路: 队列是先进先出 , 在stack2里逆序放置stack1的元素,然后stack2. ...
- 剑指offer5:用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。
1. 题目描述 用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. 2. 思想 (1)栈的特点是先进后出,而队列的特点是先进先出: (2)因此,入队列的情况和入栈的情 ...
- java两个栈实现一个队列&&两个队列实现一个栈
栈:先进后出 队列:先进先出 两个栈实现一个队列: 思路:先将数据存到第一个栈里,再将第一个栈里的元素全部出栈到第二个栈,第二个栈出栈,即可达到先进先出 源码: class Queue<E&g ...
- 02两栈共享空间_DoubleStack--(栈与队列)
#include "stdio.h" #include "stdlib.h" #include "io.h" #include " ...
- 算法(第四版)C# 习题题解——1.3.49 用 6 个栈实现一个 O(1) 队列
因为这个解法有点复杂,因此单独开一贴介绍. 那么这里就使用六个栈来解决这个问题. 这个算法来自于这篇论文. 原文里用的是 Pure Lisp,不过语法很简单,还是很容易看懂的. 先导知识——用两个栈模 ...
- Stack栈类与、Queue队列与线性表的区别和联系
栈和队列都属于特殊的线性表 一.定义 1.线性表(linear list): 是数据结构的一种,一个线性表是n个具有相同特性的数据元素的有限序列.数据元素是一个抽象的符号,其具体含义在不同的情 ...
随机推荐
- Xcode7网络限制
在info.plist添加字段 App Transport Security Settings Allow Arbitrary Loads yes
- python求微分方程组的数值解曲线01
本人最近在写一篇关于神经网络同步的文章,其一部分模型为: x_i^{\Delta}(t)= -a_i*x_i(t)+ b_i* f(x_i(t))+ \sum\limits_{j \in\{i-1, ...
- django 新闻编辑笔记
url(r'^news_manage/edit/$',views.news_edit,name='edit') url配置 <a href="/management/news_mana ...
- 第一次PS练习
嘿嘿,自己第一次的PS,虽然把在大神眼里是小KS,但是了,对我来说值得劲纪念.加油,我会努力的.
- android4.0移植,拨号异常
D/dalvikvm( 2274): GC_CONCURRENT freed 206K, 12% free 6571K/7431K, paused 2ms+3ms D/dalvikvm( 2274): ...
- 在Android开发中,定时器一般有以下3种实现方法
在Android开发中,定时器一般有以下3种实现方法: 原文地址http://www.360doc.com/content/12/0619/13/87000_219180978.shtml 一.采用H ...
- Cocos2d-x CCTableView实现列表
在ios程序设计中,会大量使用到tableview视图(UITableView),那么在cocos2d-x中,如果需要类似的列表,该如何实现呢?在引擎中参照ios中的UITableView实现了一个叫 ...
- hdu 5015 大数量反复类似操作问题/ 矩阵高速幂
题意: 给一个矩阵a,第一行是 0. 233,2333,23333.....第一列读入.列数<10^9.行数<=10. 先转化操作: m是大数量.必定每次向前推一列.就是每次乘一个矩阵T. ...
- WPF中控件ListView和DataGrid典型属性介绍
ListView GridView View视图 重要属性: public bool AllowsColumnReorder 获取或设置一个值,该值指示 System.Windows.Controls ...
- C# -- 什么是方法签名?
签名指的是返回值和参数. 比如 : public void A ( int p1,int p2){} public void B ( int q1,int q2){} 的签名相同. 而 public ...