js用两个栈实现一个队列,完成在队列尾部插入整数和在队列头部删除整数的功能。

声明:这是一道来自力扣的算法题,相关请登录该网站查看;
这里我们用js来解决以下问题

用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,
分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )

示例:

输入:
["CQueue","appendTail","deleteHead","deleteHead"]
[[],[3],[],[]]
输出:[null,null,3,-1]

一。
首先我在这里做出一个解释;我们输入的这个数组里面的几个字符串,它是几个函数,第二行的数字是相对应的参数;
输出的则是 最后返回的值。
我们首先对这道题目进行分析,关键在于第一句话 用两个栈实现一个队列。 众所周知 栈是先进后出,队列是先进先出。
很显然这道题不仅仅只是考数学这么简单,它还涉及我们对于数据储存方式的了解。

1.栈	(先进后出)
可以理解为一个多层的高楼,然后我们往栈里面存值的时候,先住到楼顶那一层,
输出这个值的时候,它从最顶层搬走。	
如果楼顶已经有值住了,再想存个新值的时候,原来的那个就会搬到下一层,楼顶住的永远都是新来的值。
然后楼顶的值搬走的时候,它下一层就会搬上来。
 以此类推
2.队列	(先进先出)
也可以理解为一个多层的高楼,然后我们往栈里面存值的时候,先住到楼顶那一层,
再想存个新值的时候,这个新值就会自己住到下一层。
然后楼顶的值搬走的时候,它下一层就会搬上来。
 以此类推

知道这些后,我们首先要解决的是 如何把两个栈变成一个队列这里我们可以把一个栈当作是输入队列的一个工具,
另一个当作输出队列的一个工具。

3.用两个栈实现一个队列
首先假设两个栈为 AB 。
向A输值 [1,2,3,4]A 中从上往下的结构是这样的[4,3,2,1]
 然后把它依次输入到BB	中从上往下的结构就变成了这样的[1,2,3,4];
 最后输出B中的这些值,我们把 从AB的这个过程看作一个整体
就是输入了[1,2,3,4],输出了[1,2,3,4];先进先出 满足队列的要求。

二。
现在我们来看题目

var CQueue = function() {

};
/** 
 * @param {number} value
 * @return {void}
 */
CQueue.prototype.appendTail = function(value) {
    
};
/**
 * @return {number}
 */
CQueue.prototype.deleteHead = function() {
   
};

输入:
["CQueue","deleteHead","appendTail","appendTail","deleteHead","deleteHead"]
[[],[],[5],[2],[],[]]
输出:[null,-1,null,null,5,2]

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/yong-liang-ge-zhan-shi-xian-dui-lie-lcof

CQueue是主函数,appendTail是输入函数,deleteHead是输出函数
输入函数输入了两个值5,2。在这之前输出函数被调用了一次,这个时候输出函数是没有值的,
因为输入函数还没有调用。所以输出的时候就输出了-1 符合题意(这一步要注意写在我们的输出函数里面)
然后输出了5,2。满足队列的先进先出。

三。
首先在主函数里面声明两个属性来当作栈来用。

var CQueue = function() {
	this.stackA = [];
	this.stackB = [];
};

然后是输入函数:

CQueue.prototype.appendTail = function(value) {
    this.stackA.push(value);
};
我们这里是把值输入到这个栈内,输入操作完成。

开始写输出函数,

CQueue.prototype.deleteHead = function() {
   if(this.stackB.length){
   	 	return this.stackB.pop();
   }else{
   }
};
	如果 stackB 没有值的话,它的长度就为0 就不会输出了,而是把stackA的值传给stackB
 if(this.stackB.length){
   	 	return this.stackB.pop();
 }else{
 		while(this.stackA.length){ /*这里也是当stackA有值的时候就会 把stackA的值传给stackB*/
 			this.stackB.push(this.stackA.pop());
 		}
 }

然后注意输出函数没有值的情况。输出-1

 if(this.stackB.length){
   	 	return this.stackB.pop();
 }else{
 		while(this.stackA.length){ /*这里也是当stackA有值的时候就会 把stackA的值传给stackB*/
 			this.stackB.push(this.stackA.pop());
 		}if(!this.stackB.length){
 			return -1;
 		}else{
 			return this.stackB.pop();
		}
 }

到这里就全部完成了。以下是完整过程:

var CQueue = function() {
    this.stackA = [];
    this.stackB = [];
};

/** 
 * @param {number} value
 * @return {void}
 */
CQueue.prototype.appendTail = function(value) {
    this.stackA.push(value);
};

/**
 * @return {number}
 */
CQueue.prototype.deleteHead = function() {
    if(this.stackB.length){
        return this.stackB.pop();
    }else{
        while(this.stackA.length){
            this.stackB.push(this.stackA.pop())
        }
        if(!this.stackB.length){
            return -1;
        }else{
            return this.stackB.pop();
        }
    }
};
  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AR.K

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值