JavaScript 中的非重复堆栈
Non-repeating stack in JavaScript
本文关键字:堆栈 JavaScript 更新时间:2023-09-26
我需要保留一堆 10 个项目(值原语,而不是对象(,其中没有重复的项目。这是我对实现的初步尝试。有什么改进建议吗?
var items = [];
function newItem() {
return Math.floor(Math.random() * 50);
}
function inArray(arr, val) {
var in_arr, i;
in_arr = false;
i = arr.length;
if (i < 1) {
return in_arr;
}
do {
if (arr[i - 1] === val) {
in_arr = true;
break;
}
} while (--i);
return in_arr;
}
function addItem() {
var new_item;
while (items.length > 9) {
items.shift();
}
do {
new_item = newItem();
} while (inArray(items, new_item));
items.push(new_item);
}
while (items.length > 9) {
items.shift();
}
可以在没有迭代的情况下编写为
var len = items.length;
if (len > 9) {
items = items.slice(len - 9);
}
从 JS 1.6 开始,inArray
可以写成 array.indexOf(element) != -1
。否则
if (i < 1) {
return in_arr;
}
do {
if (arr[i - 1] === val) {
in_arr = true;
break;
}
} while (--i);
return in_arr;
可以更简单地写成
while (i--) {
if (arr[i] === val) {
return true;
}
}
return false;
function inArray(arr, val) {
return !!~arr.indexOf(val);
}
如果需要,可以使用此垫片
function addItem(item) {
if (inArray(items, item)) return false;
if (items.length > 9) items = items.slice(len - 9);
items.push(item);
return true;
}
我会像这样重写保留的东西:
function stack10() {
var items = arguments || [];
this.addItem = function (item) {
var len = items.length;
if (!!~items.indexOf(item)) return;
if (len > 9) items = items.slice(len - 9);
items.push(item);
}
this.peek = function() {
if (items.length === 0) return null;
return items[items.length-1];
}
this.pop = function () {
return items.pop();
}
}
var myStack = new stack10();
myStack.addItem(10);
myStack.peek(); // 10
myStack.pop(); // 10
myStack.pop(); // undefined
// default values
var myStack2 = new stack10(1,2,3,4);
myStack2.addItem(10);
myStack2.peek(); // 10
myStack2.pop(); // 10
myStack2.pop(); // 4
为什么不使用堆?您可以执行 O(lg n( 插入和删除而不是 O(n(,并且它仍在原位。
相关文章:
- 为什么我的JavaScript堆栈排序函数不起作用
- 如何远程检查JavaScript应用程序的函数调用堆栈
- 打印javascript控制台的堆栈跟踪
- JavaFX+WebView/Javascript:setTimeOut不起作用调用堆栈来自Java
- JavaScript继承:未捕获的范围错误:超过了最大调用堆栈大小
- 如何删除JavaScript画布呈现上下文的状态堆栈
- 与Django和Python相比,Node.js在JavaScript和Express之间的MEAN堆栈中扮演什么角色
- 如何在 JavaScript 中更改文本标签的堆栈顺序
- 在JavaScript中异步迭代大型数组,而不会触发超出堆栈大小
- 当一个变量被传递给一个函数时,JavaScript堆栈会发生什么
- Javascript V8复合错误堆栈格式
- Android WebView:在javascript中,有没有一种方法可以加载另一个javascript文件,并为堆栈
- 日志记录功能/对象名称's在函数堆栈内的javascript中
- 可能是Javascript的堆栈问题
- 我们如何在javascript移动应用程序中记录骨干历史堆栈列表
- JavaScript 递归重写与迭代数组堆栈
- Javascript中的堆栈与堆?(超出最大调用堆栈大小)
- 如何在Internet Explorer中获取javascript堆栈跟踪.e.stack 返回 “Undefined”
- JavaScript 中的 try-catch:如何获取原始错误的堆栈跟踪或行号
- 递归堆栈-Javascript