JS用两个栈实现一个队列

题目:请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(push、pop、peek、empty):

实现 MyQueue 类:

  • void push(int x) 将元素 x 推到队列的末尾
  • int pop() 从队列的开头移除并返回元素
  • int peek() 返回队列开头的元素
  • boolean empty() 如果队列为空,返回 true ;否则,返回 false

思路:一个作为存储栈,另一个作为辅助栈

入队(push)

一个队列是 FIFO 的,但一个栈是 LIFO 的。这就意味着最新压入的元素必须得放在栈底。为了实现这个目的,我们首先需要把 s1 中所有的元素移到 s2 中,接着把新元素压入 s2。最后把 s2 中所有的元素弹出,再把弹出的元素压入 s1。

出队(pop)

直接从 s1 弹出就可以了,因为 s1 的栈顶元素就是队列的队首元素。同时我们把弹出之后 s1 的栈顶元素赋值给代表队首元素的 front 变量。

判断空(empty)

s1 存储了队列所有的元素,所以只需要检查 s1 的是否为空就可以了。

取队首元素(peek)

在我们的算法中,用了 front 变量来存储队首元素,在每次 入队 操作或者 出队 操作之后这个变量都会随之更新。

完整代码

var MyQueue = function() {
  this.stack = [];
  this.helpStack = [];
};

MyQueue.prototype.push = function(x) {
  while(this.stack.length !== 0){
    this.helpStack.push(this.stack.pop());
  }
  this.helpStack.push(x);
  while(this.helpStack.length !== 0){
    this.stack.push(this.helpStack.pop());
  }
};

MyQueue.prototype.pop = function() {
  return this.stack.pop();
};

MyQueue.prototype.peek = function() {
  return this.stack[this.stack.length - 1];
};

MyQueue.prototype.empty = function() {
  return this.stack.length === 0;
};

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
下面是使用双端队列实现撤销重做功能的类的示例代码: ```javascript class UndoRedo { constructor() { this.undoStack = []; // 撤销 this.redoStack = []; // 重做 } // 执行操作并将操作添加到撤销中 doAction(action) { this.undoStack.push(action); this.redoStack = []; // 清空重做 action.execute(); } // 撤销操作 undo() { const action = this.undoStack.pop(); if (action) { this.redoStack.push(action); action.undo(); } } // 重做操作 redo() { const action = this.redoStack.pop(); if (action) { this.undoStack.push(action); action.redo(); } } } // 示例使用 // 创建一个操作类 class Action { constructor(value) { this.value = value; } execute() { console.log('执行操作:', this.value); } undo() { console.log('撤销操作:', this.value); } redo() { console.log('重做操作:', this.value); } } const undoRedo = new UndoRedo(); // 执行操作并撤销 undoRedo.doAction(new Action('操作1')); undoRedo.doAction(new Action('操作2')); undoRedo.undo(); // 撤销操作2 // 重做操作 undoRedo.redo(); // 重做操作2 ``` 在上述示例中,我们定义了一个UndoRedo类,其中包含两个,undoStack用于存储执行的操作,redoStack用于存储被撤销的操作。doAction方法用于执行操作并将其添加到撤销中,undo方法用于撤销最近的操作,redo方法用于重做最近被撤销的操作。 我们还创建了一个Action类作为示例操作,其中包含execute方法用于执行操作,undo方法用于撤销操作,redo方法用于重做操作。 在示例使用部分,我们创建了UndoRedo实例,并通过doAction方法执行两个操作。然后调用undo方法进行撤销操作,并调用redo方法进行重做操作。 你可以根据你的需求来定义自己的操作类和具体的操作逻辑。这个类可以帮助你实现撤销和重做功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

前端吕小布

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

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

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

打赏作者

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

抵扣说明:

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

余额充值