两个栈实现队列+两个队列实现栈----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的更多相关文章

  1. 二、 编写一个类,用两个栈实现队列,支持队列的基本操作(add,poll,peek)

    请指教交流! package com.it.hxs.c01; import java.util.Stack; /* 编写一个类,用两个栈实现队列,支持队列的基本操作(add,poll,peek) */ ...

  2. 算法:用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。

    算法:用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型.<剑指offer> 利用栈来进行操作,代码注释写的比较清楚:首先判断两个栈是否是空的:其次当栈二 ...

  3. 面试题9-用两个栈来实现一个队列,完成队列的Push和Pop操作

    题目 用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. 思路: 一个栈压入元素,而另一个栈作为缓冲,将栈1的元素出栈后压入栈2中 代码 import java.ut ...

  4. [剑指offer] 5. 用两个栈实现队列+[剑指offer]30. 包含min函数的栈(等同于leetcode155) +[剑指offer]31.栈的压入、弹出序列 (队列 栈)

    c++里面stack,queue的pop都是没有返回值的, vector的pop_back()也没有返回值. 思路: 队列是先进先出 , 在stack2里逆序放置stack1的元素,然后stack2. ...

  5. 剑指offer5:用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。

    1. 题目描述 用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. 2. 思想 (1)栈的特点是先进后出,而队列的特点是先进先出: (2)因此,入队列的情况和入栈的情 ...

  6. java两个栈实现一个队列&&两个队列实现一个栈

    栈:先进后出  队列:先进先出 两个栈实现一个队列: 思路:先将数据存到第一个栈里,再将第一个栈里的元素全部出栈到第二个栈,第二个栈出栈,即可达到先进先出 源码: class Queue<E&g ...

  7. 02两栈共享空间_DoubleStack--(栈与队列)

    #include "stdio.h" #include "stdlib.h" #include "io.h" #include " ...

  8. 算法(第四版)C# 习题题解——1.3.49 用 6 个栈实现一个 O(1) 队列

    因为这个解法有点复杂,因此单独开一贴介绍. 那么这里就使用六个栈来解决这个问题. 这个算法来自于这篇论文. 原文里用的是 Pure Lisp,不过语法很简单,还是很容易看懂的. 先导知识——用两个栈模 ...

  9. Stack栈类与、Queue队列与线性表的区别和联系

    栈和队列都属于特殊的线性表   一.定义   1.线性表(linear list): 是数据结构的一种,一个线性表是n个具有相同特性的数据元素的有限序列.数据元素是一个抽象的符号,其具体含义在不同的情 ...

随机推荐

  1. Apple Watch程序开发30分钟秒懂

    苹果公司Apple Watch智能手表正在备受追捧,迅速掌握Apple Watch的APP架构,环境搭建,及实例开发将会让开发者占尽先机.我赢职场全国首发,30分钟玩转Apple Watch应用开发实 ...

  2. 友盟iOS微信登陆没有回调的原因

    1.在友盟文档中这样说: 链接 7.4 微信登录 添加配置文件参考文档:添加微信及朋友圈,添加相关库文件,配置URL schemes及添加系统回调 注意微信登录必须先在微信开放平台申请微信登录权限 在 ...

  3. codeblock快捷键

    一款开源的C/C++ IDE(集成开发环境),基于wxWidgets GUI体系,跨平台支持. 从别处粘贴的,方便以后看,啦啦啦…… 编辑器 快捷键 功能 Ctrl+Z 恢复上一次操作 Ctrl+Sh ...

  4. CodeForces 486C Palindrome Transformation 贪心+抽象问题本质

    题目:戳我 题意:给定长度为n的字符串,给定初始光标位置p,支持4种操作,left,right移动光标指向,up,down,改变当前光标指向的字符,输出最少的操作使得字符串为回文. 分析:只关注字符串 ...

  5. C++中,引用作为函数参数

    引用作为函数参数 C++之所以增加引用类型, 主要是把它作为函数参数,以扩充函数传递数据的功能. ———————————————————— c++,函数传参:(1)将变量名作为实参和形参.这时传给形参 ...

  6. PyQt中如何隐藏Menu

    PyQt中隐藏一个Menu Item,可以通过QAction的setVisible(False)来设置,而QMenu的setVisible(False)是不管用的. 现在问题来了,我们有一个菜单,它有 ...

  7. linux下I2C驱动

    2C协议规定了主机和从机的概念,在驱动中采用的多是适配器(主机)和设备(从机).首先,i2c规定  Bus    -> Algorithm  算法               Adapter   ...

  8. poj 3368 Frequent values(段树)

    Frequent values Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 13516   Accepted: 4971 ...

  9. PHP - 四级单词lrc文件解析为txt

    原始文件: 转换后文件: php代码: 首先根据需要更改文件路径. 转换后存放的文件要事先创建,为txt文件. 核心代码:正则表达式替换: <?php header('Content-type: ...

  10. c++空指针调用类成员函数

    最近在看C++动态绑定问题时(理解静态绑定时)发现的问题:能用空指针调用类的成员函数(gcc,vs2013下都可以). 例子: class animal { public: void sleep(){ ...