《剑指offer》— JavaScript(5)用两个栈实现队列

用两个栈实现队列

题目描述

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


实现代码

function Stack(){
    var items=[];
    this.push=function(item){
        items.push(item);
    }
    this.pop=function(){
        return items.pop();
    }
    this.isEmpty=function(){
        return items.length==0;
    }
}

var stack1= new Stack();
var stack2= new Stack();

function push(node)
{
    stack1.push(node);
}
function pop()
{
    //如果都为空,抛出错误
    if(stack1.isEmpty() && stack2.isEmpty()){
        throw new Error("Queue is empty");
    }
   // 如果栈2是空,那么将栈1所有元素出栈,一次放入栈2
    if(stack2.isEmpty()){
        while(!stack1.isEmpty()){
             stack2.push(stack1.pop())
        }
    }
   //如果栈2不为空,直接出栈
    return stack2.pop();
}

思路

  入队:将元素进栈1;
  出队:判断栈2是否为空,如果为空,则将栈1中所有元素pop,并push进栈2,栈2出栈; 如果不为空,栈2直接出栈。

相关知识

  栈(stack)又名堆栈,它是一种运算受限的线性表。其限制是仅允许在表的一端进行插入和删除运算。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。
  队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作。进行插入操作的端称为队尾,进行删除操作的端称为队头。

时间: 2024-08-29 16:09:02

《剑指offer》— JavaScript(5)用两个栈实现队列的相关文章

《剑指offer》之用两个栈实现队列

题目描述:用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. 解题思路:把stack1作为主栈,每次有新元素入队,先把stack1中所有元素pop到stack2中暂存,再push新元素到stack1,最后把stack2中元素pop到stack1. 代码实现: 1 import java.util.Stack; 2 3 public class Solution { 4 Stack<Integer> stack1 = new Stack<Integer&g

剑指offer五之用两个栈实现队列

一.题目 用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. 二.思路 1.Push操作:将数据直接压入stack1即可 2.Pop操作:将stack1中的数据全部弹出压入到stack2中,然后将stack1中的数据全部弹出即可 注意:要将stack1中的数据全部压入到stack2中后,才能将stack2中的数据弹出 三.代码 1.解决方法 import java.util.Stack; public class Solution { Stack<Integer

【剑指Offer】05 - 用两个栈实现队列

重建二叉树 时间限制:1秒 空间限制:32768K 本题知识点:队列 栈 题目描述: 用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. import java.util.Stack; public class Solution { Stack<Integer> stack1 = new Stack<Integer>(); Stack<Integer> stack2 = new Stack<Integer>(); publi

剑指offer(PHP版改写)---两个栈实现队列

$arr1 = array();$arr2 = array(); function push($node){ global $arr1; array_push($arr1,$node);} function pop(){ global $arr1; global $arr2; if (!empty($arr2)){ return array_pop($arr2); }else{ while (!empty($arr1)){ array_push($arr2,array_pop($arr1));

剑指offer(五):用两个栈实现一个队列

题目: 用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. 解决办法: 队列先进先出,栈先进后出(stack1和stack2) 其实主要要注意的点是: ①在添加时直接往第一个添加即可 ②在删除时分情况, 第一:如果stack2不为空,则直接弹出stack2中的元素即可,因为stack2中的肯定要比stack1中的元素加进来早 第二:如果stack2是空的,则把stack1中的元素一一弹出并加入到stack2中,之后再弹出 如图测试数据:(结合下面代码看) 1 i

【剑指offer】递归循环两种方式反转链表

转载请注明出处:http://blog.csdn.net/ns_code/article/details/25737023 本文分别用非递归和递归两种方式实现了链表的反转,在九度OJ上AC. 题目描述: 输入一个链表,反转链表后,输出链表的所有元素.(hint : 请务必使用链表) 输入: 输入可能包含多个测试样例,输入以EOF结束.对于每个测试案例,输入的第一行为一个整数n(0<=n<=1000):代表将要输入的链表的个数.输入的第二行包含n个整数t(0<=t<=1000000)

【剑指offer】Q17:合并两个排序的链表

def Merge(head1, head2): if head1 == None: return head2 if head2 == None: return head1 psuhead = ListNode(-1) tail = psuhead while head1 and head2: if head1.val < head2.val: cur = head1 head1 = head1.next else: cur = head2 head2 = head2.next cur.next

【剑指offer】包括min函数的栈

转载请注明出处:http://blog.csdn.net/ns_code/article/details/26064213 剑指offer上的第21题,之前在Cracking the Coding interview上做过,思路參考这里,这次写了測试函数,在九度OJ上測试通过. 题目描写叙述: 定义栈的数据结构,请在该类型中实现一个可以得到栈最小元素的min函数. 输入: 输入可能包括多个測试例子,输入以EOF结束.对于每一个測试案例,输入的第一行为一个整数n(1<=n<=1000000),

剑指offer-面试题7:俩个栈实现队列(java)

详细分析请参照C语言版,这里仅仅给出实现代码,注释很详细,不得不说java各种api用起来真是爽飞了 1 package com.xsf.SordForOffer; 2 3 import java.util.Stack; 4 5 /** 6 * 剑指offer pro7,俩个链表实现一个队列 7 * @author ELVIS 8 */ 9 class ListQueue{ 10 //定义俩个栈 11 private Stack<String> stack1 = new Stack<St

剑指offer(十六) 合并两个排序的链表

合并两个排序的链表 题目描述 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. 用JavaScript非递归和递归方式都AC了. 非递归: function ListNode(x){ this.val = x; this.next = null; } function Merge(pHead1, pHead2) { if(!pHead1) { return !pHead2 ? null:pHead2; }else if(!pHead2) { retur