栈:先进后出  队列:先进先出

两个栈实现一个队列:

思路:先将数据存到第一个栈里,再将第一个栈里的元素全部出栈到第二个栈,第二个栈出栈,即可达到先进先出

源码:

class Queue<E>{  //用的jdk自带的栈
private Stack<E> s1=new Stack<>();
private Stack<E> s2=new Stack<>();
public void offer(E val){ //入队
s1.push(val);
}
public E poll() { //出队
while (s2.empty()){
while (!s1.empty()){
s2.push(s1.peek());
s1.pop();
}
}
E val=s2.peek();
s2.pop();
//获取出队元素后,再将s2里面的元素放入s1里面。
while (!s2.empty()){
s1.push(s2.pop());
}
return val;
} public E peek(){//查看对头元素
while (s2.empty()){
while (!s1.empty()){
s2.push(s1.peek());
s1.pop();
}
}
E val=s2.peek();
//获取出队元素后,再将s2里面的元素放入s1里面。
while (!s2.empty()){
s1.push(s2.pop());
}
return val;
} public boolean empty(){ //判断队是否为空
return s1.empty();
}
}

测试:

public static void main(String[] args) {
Queue<Integer> queue = new Queue<>();
Random rand = new Random();
for (int i = 0; i < 5; i++) {
int data = rand.nextInt(100);
System.out.print(data + " ");
queue.offer(data);
}
System.out.println();
System.out.println("出队:");
while (!queue.empty()) {
System.out.print(queue.poll()+" ");
}
}

运行结果:

79 67 45 73 59 
出队:
79 67 45 73 59

两个队列实现一个栈:

思路:先将数据存到第一个队列里面,然后数据出队一直出队到地二个队列里面,直到第一个队列里面剩余一个数据,这个时候出队 即可达到先进后出的特性

源码:

自定义的一个循环队列:

class Queue<E>{
// 存储队列元素的数组
private E[] que;
// 表示队头的位置
private int front;
// 表示队尾的位置
private int rear; public E[] getQue() {
return que;
} public int getFront() {
return front;
} public int getRear() {
return rear;
} /**
* 默认构造队列,初始大小是10
*/
public Queue(){
this(10);
}
/**
* 用户可以指定队列的大小size
* @param size
*/
public Queue(int size){
this.que = (E[])new Object[size];
this.front = this.rear = 0;
}
/**
* 入队操作
* @param val
*/
public void offer(E val){
if(full()){
// 扩容
E[] newQue = Arrays.copyOf(this.que,
this.que.length*2);
int index = 0;
for(int i=this.front;
i != this.rear;
i=(i+1)%this.que.length){
newQue[index++] = this.que[i];
}
this.front = 0;
this.rear = index;
this.que = newQue;
}
this.que[this.rear] = val;
this.rear = (this.rear+1)%this.que.length;
} /**
* 出队操作,并把出队的元素的值返回
*/
public E poll(){
if(empty()){
return null;
}
E front = this.que[this.front];
this.front = (this.front+1)%this.que.length;
return front;
} /**
* 查看队头元素
* @return
*/
public E peek(){
if(empty()){
return null;
}
return this.que[this.front];
} /**
* 判断队满
* @return
*/
public boolean full(){
return (this.rear+1)%this.que.length == this.front;
} /**
* 判断队空
* @return
*/
public boolean empty(){
return this.rear == this.front;
}
}

两个队列实现一个栈:

class SeqStack<E>{
private Queue<E> que1; // 存放栈的元素
private Queue<E> que2; // 做一个辅助操作 public SeqStack(){
this.que1 = new Queue<>();
this.que2 = new Queue<>();
} public SeqStack(int size){
this.que1 = new Queue<>(size);
this.que2 = new Queue<>(size);
} public void push(E val){
this.que1.offer(val);
} public E pop(){
// 从que1出队,把最后一个出队的元素返回
E data = null;
/**
* 把que1里面的所有元素出队,放入que2里面,
* 然后把que1最后一个出队的元素直接返回,不用放入que2
*/
while(!this.que1.empty()){
data = this.que1.poll();
if(this.que1.empty()){
break;
}
this.que2.offer(data);
} // 获取该出栈的元素以后,再把que2的元素再放入que1里面
while(!this.que2.empty()){
this.que1.offer(this.que2.poll());
} return data;
} public E top(){
// 从que1出队,把最后一个出队的元素返回
E data = null; while(!this.que1.empty()){
data = this.que1.poll();
this.que2.offer(data);
} // 获取该出栈的元素以后,再把que2的元素再放入que1里面
while(!this.que2.empty()){
this.que1.offer(this.que2.poll());
} return data;
} public boolean full(){
return this.que1.full();
} public boolean empty(){
return this.que1.empty();
}
}

测试:

    public static void main(String[] args) {
SeqStack<Integer> seqStack=new SeqStack<>();
Random rand = new Random();
for (int i = 0; i < 5; i++) {
int data = rand.nextInt(100);
System.out.print(data + " ");
seqStack.push(data);
}
System.out.println();
System.out.println("出栈:");
while (!seqStack.empty()) {
System.out.print(seqStack.pop()+" ");
}
}

运行结果:

9 3 7 83 32
出栈:
32 83 7 3 9

java两个栈实现一个队列&&两个队列实现一个栈的更多相关文章

  1. 两个栈实现队列+两个队列实现栈----java

                                               两个栈实现队列+两个队列实现栈----java 一.两个栈实现一个队列 思路:所有元素进stack1,然后所有出s ...

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

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

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

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

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

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

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

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

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

    为说明思想,假设队列.栈都很大,不会出现满的情况. 1. 两个栈实现队列 //前提已知: struct Stack { int top; //栈顶指针 int stacksize;//栈的大小 int ...

  7. 对于长沙互联网发展,一个外来两年Java程序员的所见所感所愿

    惟楚有材,于斯为盛 本文有感于2019长沙互联网求职招聘大会,内容比较多,但都是我自己的一些所见.所感和所愿. 2019年3月的最后一天,参加2019长沙互联网求职招聘大会,看到了很多的招聘企业,也看 ...

  8. java:合并两个排序的整数数组A和B变成一个新的数组。新数组也要有序。

    合并两个排序的整数数组A和B变成一个新的数组.新数组也要有序. 样例 1: 输入: A=[1], B=[1] 输出:[1,1] 样例解释: 返回合并后的数组. 样例 2: 输入: A=[1,2,3,4 ...

  9. Java里一个线程两次调用start()方法会出现什么情况

    Java的线程是不允许启动两次的,第二次调用必然会抛出IllegalThreadStateException,这是一种运行时异常,多次调用start被认为是编程错误. 如果业务需要线程run中的代码再 ...

随机推荐

  1. Shell内置命令——declare

  2. shell read变量

  3. C++32位和64位常见类型的大小

             32位      64位 char      1       1 int                       4      大多数4,少数8 long      4      ...

  4. Splay(区间翻转)&树套树(Splay+线段树,90分)

    study from: https://tiger0132.blog.luogu.org/slay-notes P3369 [模板]普通平衡树 #include <cstdio> #inc ...

  5. rest_framework框架实现之(认证)

    一认证 我们可以想想,我们要访问一个页面,需不需要对其进行认证,希望进入页面的时候看到哪些内容,一般是根据用户的不同而不同 首先,我们先设计一个表,如何知道对方通过了验证,我们可以考虑给其加一个tok ...

  6. PHP ftp_chmod() 函数

    定义和用法 ftp_chmod() 函数设置 FTP 服务器上指定文件的权限. 如果成功,该函数返回新的权限.如果失败,则返回 FALSE 和一个警告. 语法 ftp_chmod(ftp_connec ...

  7. Android中对应用程序的行为拦截实现方式概要

    这次是真的好长时间都没有写博客了,主要不是因为工作上的事,主要还是这个问题真的有点复杂,实现起来有点麻烦,所以研究了很长时间(大约有一个月的时间).但是幸好最后问题搞定了~~ 一.问题场景 想实现36 ...

  8. java在acm中常用基础技巧方法

    java在acm中常用基础技巧方法 如果学到了新的技巧,本博客会更新~ input input-std @Frosero import java.util.*; public class Main { ...

  9. Likecloud-吃、吃、吃

    题目背景 问世间,青春期为何物? 答曰:"甲亢,甲亢,再甲亢:挨饿,挨饿,再挨饿!" 题目描述 正处在某一特定时期之中的李大水牛由于消化系统比较发达,最近一直处在饥饿的状态中.某日 ...

  10. JAVA导出excel如何设置表头跨行或者跨列,跪求各位大神了

    sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, 0));// 开始行,结束行,开始列,结束列.只能是POI了吧?java还有其他方法吗?