剑指offer第二版-9.用两个栈实现队列

描述:使用两个栈实现一个队列。队列中实现尾部插入和头部删除函数。

思路:stack1负责插入,stack2负责弹出,如果stack2为空了,将stack1的元素依次弹出并存放到stack2中,之后对stack2进行弹出操作。

考点:对栈和队列的理解;对泛型的使用等。

/**
 * Copyright(C) 2019 Hangzhou Differsoft Co., Ltd. All rights reserved.
 *
 */
package com.java.offer;

import java.util.Stack;

/**
 * 用两个栈实现队列
 *
 * @since 2019年2月25日 下午5:21:48
 * @author xuchao
 *
 */
public class P9_QueueWithTwoStacks {

    public static void main(String[] args) {
        Queue<Integer> queue = new Queue<>();
        queue.insert(1);
        queue.insert(2);
        queue.insert(3);
        System.out.println(queue.delete());
        System.out.println(queue.delete());
        queue.insert(4);
        System.out.println(queue.delete());
    }
}

class Queue<T> {
    private Stack<T> stack1 = new Stack<>();
    private Stack<T> stack2 = new Stack<>();

    public void insert(T data) {
        stack1.push(data);
    }

    public T delete() {
        if (!stack2.isEmpty()) {
            return stack2.pop();
        }else if(!stack1.isEmpty()) {
            while(!stack1.isEmpty()) {
                stack2.push(stack1.pop());
            }
            return stack2.pop();
        }
        return null;
    }
}

原文地址:https://www.cnblogs.com/chao-zjj/p/10436356.html

时间: 2024-11-05 18:52:16

剑指offer第二版-9.用两个栈实现队列的相关文章

【剑指offer】9、用两个栈实现队列

题目 用两个栈实现队列.队列声明如下,实现appendTail和deleteHead,分别完成在队列尾部插入节点,和头部删除节点的功能. 思路 尾部插入:直接向stack1压入即可 头部删除:先进先出,因此在删除时,若stack1非空,先将stack1全部元素压入stack2,然后stack2.pop()即可 class Solution { public: void push(int node) { stack1.push(node); } int pop() { if (stack2.siz

剑指offer【05】- 用两个栈实现队列(java)

题目:用两个栈实现队列 考点:栈和队列 题目描述:用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. 解题思路:每次psuh是时先将stack2清空放入stck1(保证选入的一定在栈底),stack2始终是用来删除的.在pop前,先将stack1中中的数据清空放入stack2(保存后入的在栈底),stack1始终用于push. 1 import java.util.Stack; 2 3 public class Solution { 4 Stack<Intege

剑指offer(5)用两个栈实现队列

题目描述: 用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. 解题代码: var stack1 = []; var stack2 = []; //栈:后进先出:队列:先进先出:用栈1来保存进来的数 function push(node) { // write code here stack1.push(node); } //模拟出队列:出栈1的数全部放进栈2,第一个出栈2的数即为第一个出队的数,返回它,再将剩下的数全部放入栈1 function pop() {

【剑指Offer】5、用两个栈实现队列

??题目描述: ??用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. ??解题思路: ??本题的基本意图是:用两个后入先出的栈来实现先入先出的队列.对于这个问题,我们可以通过一个实例来进行具体分析.不难得出相应的规律:有两个栈stack1和stack2,每次向队列中插入元素可以都压入到stack1中,当需要从队列中删除元素时,我们应该是删除最早插入的那个(FIFO),这时可以将stack1中的元素逐个弹出并压入stack2,直到stack1为空,这时最早插入的

结合《剑指offer(第二版)》面试题51来谈谈归并排序

一.题目大意 给定一个数组A,对于数组A中的两个数字,如果排在前面的一个数字大于(必须大于,等于不算)后面的数字,则这两个数字组成一个逆序对.要求输出数组A中的逆序对的总数.例如,对于数组{7,5,6,4},一共存在5个逆序对,分别是(7,5).(7,6).(7,4).(5,4).(6,4). 注:根据题意可知,必须根据原数组中元素的相对顺序来统计,给定的数组时怎样,那就按照怎样的顺序. 二.思路分析 方法1:暴力破解.双重循环来判断出所有的逆序对数,时间复杂度为O(N^2),空间复杂度为O(1

剑指offer:滑动窗口的最大值(栈和队列)

1. 题目描述 /* 给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值. 例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,他们的最大值分别为{4,4,6,6,6,5}: 针对数组{2,3,4,2,6,2,5,1}的滑动窗口有以下6个: {[2,3,4],2,6,2,5,1}, {2,[3,4,2],6,2,5,1}, {2,3,[4,2,6],2,5,1}, {2,3,4,[2,6,2],5,1}, {2,3,4,2,[6,2,5],

剑指offer之面试题17合并两个排序的链表

问题描述: 输入两个递增的链表,合并这两个链表并使新链表中的结点仍然是按照递增排序的. 实现代码如下: #include <stdio.h> #include <stdlib.h> #include <stdbool.h> struct List{ int date; struct List *next; }; struct List* doMergeList(struct List *P1head,struct List *P2head){ if(P1head==NU

剑指offer系列10:合并两个排序的链表

我拿到这个题的时候举的例子是链表1:1.3.5.7和链表2:2.4.6.8.我的思路是以:1为基础,将表2的每个结点插入表1.也就是说我一次性是要给新建立的链表中加入两个元素,分别是两个原始链表的头结点.这个思路我做了半天头脑一片混乱,中间指针实在不知道怎么弄了.于是我去睡了一觉,哈哈,我大概是这个世界上最会逃避的人了…… 看了答案使用了递归的方法,其实我做的时候我有想到要用递归,但是没用的原因是我一般写代码不喜欢用递归,原因有两个,一个是递归容易死循环,一个是递归的复杂度太高.但这道题真的太适

【剑指offer】13,包含min函数的栈

题目描述 定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数. 分析:使用两个栈,一个正常存取元素,一个栈用来存储最小的元素,代码如下: 1 import java.util.Stack; 2 3 public class Solution { 4 5 Stack<Integer> s1 = new Stack<Integer>() ; 6 Stack<Integer> s2 = new Stack<Integer>() ; 7 publi