两个队列实现一个栈 + 两个栈实现一个队列

面试中常出现让你手写两个队列实现一个栈,两个栈实现一个队列的问题,很是头疼!今天就仔细将我分析,思考过的Java代码给大家分享一下:(一)两个队列实现一个栈:

两个队列添加元素,哪个队列为空,由于在输出元素时,要进行相应元素的移动(除去尾部元素),所以要在对应不为空的队列进行元素的添加;在输出数据时,要进行两个队列的变相操作,不为空的队列要依次向为空的队列中添加元素,直到尾元素输出即可!

/**
 * 两个队列实现一个栈
 * @auther yangchao
 * @date 2019/7/18
 */

public class TwoQueueImplStack {

    private Queue<Integer> queue1 = new ArrayDeque<>();

    private Queue<Integer> queue2 = new ArrayDeque<>();

    /**
     * 向栈中压入数据
     * @param element
     */
    public void push(Integer element) {
        //两个队列为空时,优先考虑queue1
        if (queue1.isEmpty() && queue2.isEmpty()) {
            queue1.add(element);
            return;
        }

        //如果queue1为空,queue2有数据,直接放入queue2
        if (queue1.isEmpty()) {
            queue2.add(element);
            return;
        }

        //如果queue1为空,queue2有数据,直接放入queue2
        if (queue2.isEmpty()) {
            queue1.add(element);
            return;
        }
    }

    /**
     * 取出栈中的数据
     * @return
     */
    public Integer poll() {
        //两个队列为空时,直接抛出异常
        if (queue1.isEmpty() && queue2.isEmpty()) {
            throw new RuntimeException("stack is empty");
        }

        //如果queue1为空,将queue2中的元素依次加入到 queue1, 弹出最后一个元素
        if (queue1.isEmpty()) {
            while(queue2.size() > 1) {
                queue1.add(queue2.poll());
            }
            return queue2.poll();
        }

        //如果queue2为空,将queue1中的元素依次加入到 queue2, 弹出最后一个元素
        if (queue2.isEmpty()) {
            while(queue1.size() > 1) {
                queue2.add(queue1.poll());
            }
            return queue1.poll();
        }
        return null;
    }

    public static void main(String[] args) {
        TwoQueueImplStack qs = new TwoQueueImplStack();
        qs.push(2);
        qs.push(4);
        qs.push(7);
        qs.push(5);
        System.out.println(qs.poll());
        System.out.println(qs.poll());

        qs.push(1);
        System.out.println(qs.poll());
    }

}

输出结果:

(二)两个栈实现一个队列:

第一个栈只负责添加元素,第二个栈在弹出元素时,首先判断当前栈是否为空,若为空就直接将其第一个栈中的数据全部压入第二个栈中,然后输出栈顶元素,即可实现队列效果;若第二个栈中有数据,添加直接将其数据压入第一个栈中,输出时直接输出第二个栈顶的元素即可!

/**
 * 两个栈实现一个队列
 * @auther yangchao
 * @date 2019/7/18
 */

public class TwoStackImplQueue {

    private Stack<Integer> stack1 = new Stack<>();

    private Stack<Integer> stack2 = new Stack<>();

    /**
     * stack1只负责压入队列元素
     * @param element
     */
    public void push(Integer element) {
        stack1.add(element);
    }

    /**
     * 取出队列顶部元素
     * @return
     */
    public Integer poll() {
        //若stack2为空,将 stack1 中的元素压入 stack2
        if (stack2.isEmpty()) {
            while (stack1.size() > 0) {
                stack2.add(stack1.pop());
            }
        }
        if (stack2.isEmpty()) {
            throw new RuntimeException("queue is Empty!");
        }
        Integer head = stack2.pop();
        return head;
    }

    public static void main(String[] args) {
        TwoStackImplQueue sq = new TwoStackImplQueue();
        sq.push(1);
        sq.push(3);
        sq.push(5);
        sq.push(4);
        sq.push(2);

        System.out.println(sq.poll());
        System.out.println(sq.poll());

        sq.push(7);
        System.out.println(sq.poll());
    }

}

输出结果:

  每天进步一点点,继续加油......

原文地址:https://www.cnblogs.com/blogtech/p/11208058.html

时间: 2024-08-30 05:11:29

两个队列实现一个栈 + 两个栈实现一个队列的相关文章

两个堆栈实现一个队列和一叠两个队列实现【算法导论课后题】

两个栈实现队列两个队列实现堆栈问题,网上有很多资料.这里仅仅是叙述操作方法的介绍觉得至少. 两个栈实现一个队列 思想:假设两个栈分别为s1,s2.对s1进行入队,出队时,先推断s2是否为空,假设是则将s1中元素压入s2并弹出最上面元素,假设不是,则直接弹出s2最上面的元素. <span style="font-size:18px;">EnQueue(s1,s2,k){ push(s1,k)</span><span style="font-fami

练习3.21 一个数组两个站栈

#include<stdio.h> #include<stdlib.h> struct Node; typedef struct Node *PtrToDStack; struct Node{ int top1,top2; int Capacity; int *Array; }; PtrToDStack CreateStack( int Size ) { PtrToDStack s; s = malloc( sizeof( struct Node ) ); s->Array

程序员面试100题之十:快速找出一个数组中的两个数字,让这两个数字之和等于一个给定的值(转)

能否快速找出一个数组中的两个数字,让这两个数字之和等于一个给定的值,为了简化起见,我们假设这个数组中肯定存在至少一组符合要求的解. 假如有如下的两个数组,如图所示: 5,6,1,4,7,9,8 给定Sum= 10 1,5,6,7,8,9 给定Sum= 10 分析与解法 这个题目不是很难,也很容易理解.但是要得出高效率的解法,还是需要一番思考的. 解法一 一个直接的解法就是穷举:从数组中任意取出两个数字,计算两者之和是否为给定的数字. 显然其时间复杂度为N(N-1)/2即O(N^2).这个算法很简

rpm包格式安装配置lamp提供两个虚拟主机分别wordpress和phpMyAdmin,后一个提供ssl访问方式。

第一步:设置虚拟主机 首先在/ 监听两个端口,用于开启两个页面: Listen  172.16.249.139:80 Listen  172.16.249.139:80 将主路径取消 #DocumentRoot "/var/www/html" 设置虚拟主机以及IP NameVirtualHost 172.16.249.139:80 设置两个虚拟主机 <VirtualHost *:80> ServerAdmin [email protected] DocumentRoot /

使一个Button两个事件的处理方法

在我们程序代码中时常会有这样一种操作  (一个button  点击一次触发一个状态  当再一次点击button 触发另一个事件  循环交互两个事件) 我们可以这样简单的操作: 首先设置一个全局变量 BOOL 类型: flag: if(flag == 0){ write code     //第一次单击button触发的事件flag = 1: // 把标志位置1} else{ write code  //第二次单击button改变触发的事件flag = 0: //把标志位置0}OK  够简便了吧

css如何实现一个文字两种颜色代码实例

css如何实现一个文字两种颜色代码实例:在实际应用中可能需要设置文本效果比较炫酷.有一种效果就是将一个文字设置为两种颜色,使用普通的方法肯定是无法实现.下面就分享一下实现此功能的代码实例: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name="author" content="http://www.softwhy.com/&qu

SQL两表之间:根据一个表的字段更新另一个表的字段

1. 写法轻松,更新效率高: update table1 set field1=table2.field1, field2=table2.field2 from table2 where table1.id=table2.id 2. 常规方式,种写法相当于一个 Left join, 以外面的where为更新条数,如果不加where就是所有记录 update table1 set field1=(select top 1 field1 from table2 where table2.id=tab

js字符串长度计算(一个汉字==两个字符)和字符串截取

js字符串长度计算(一个汉字==两个字符)和字符串截取 String.prototype.realLength = function() { return this.replace(/[^\x00-\xff]/g, "**").length; // [^\x00-\xff] - 匹配非双字节的字符 }; String.prototype.realSubstring = function(n){ var str = this||''; if(this.realLength()<=n

git 利用分支概念实现一个仓库管理两个项目

需求描述:开发了一个网站,上线之际,突然另一个客户说也想要个一样的网站,但网站的logo和内部展示图片需要替换一下,也就是说大部分的后台业务逻辑代码都是一致的,以后升级时功能也要保持一致:刚开始想反正是两个项目,干脆弄两个工程吧,但这样做的话,只有修改个公共的代码逻辑两个项目都要修改一遍,太麻烦了,还容易出错了,太麻烦了,难道没有个好的办法,修改一次代码,两个项目可以共用?突然想到了git的分支概念,我靠~单独再拉出个分支,这不一下就解决了: 前提假设:假设之前开发的网站叫a,另一个客户想要一模