我在geeksforgeeks网站上阅读了有关使用javascript和python实现堆栈实现的文章。我实现了代码,以删除javascript中堆栈中的中间元素,就像在同一网站上为python给出的一样。但是我得到了错误的答案。为什么会这样呢?在这种情况下,两种语言有什么区别?如何在javascript中获得正确答案?下面是Javascript中的代码。
class Stack {
constructor() {
this.items = [];
}
push(element) {
this.items.push(element);
}
pop() {
if (this.items.length === 0) {
return "Underflow";
} else {
return this.items.pop();
}
}
peek() {
return this.items[this.items.length - 1];
}
isEmpty() {
return this.items.length == 0;
}
print() {
console.log(this.items);
}
}
function deleteMid(stack, curr) {
// If stack is empty or all items
// are traversed
if (stack.isEmpty() || curr == stack.items.length) {
return;
}
// Remove last item
x = stack.peek();
stack.pop();
// Remove other items
deleteMid(stack, curr + 1);
console.log("length value: ", stack.items.length);
// Put all items back except middle
if (curr != Math.floor(stack.length / 2)) {
stack.push(x);
}
}
var stack = new Stack();
stack.push(1);
stack.push(2);
stack.push(3);
stack.print();
deleteMid(stack, 0);
stack.print();
答案 0 :(得分:1)
由于您在开始时就知道中间索引,因此可以在删除每个项目后检查堆栈的长度,并在碰到中间时停止。
class Stack {
constructor() {
this.items = [];
}
push(element) {
this.items.push(element);
}
pop() {
if (this.items.length === 0) {
return "Underflow";
} else {
return this.items.pop();
}
}
peek() {
return this.items[this.items.length - 1];
}
isEmpty() {
return this.items.length == 0;
}
print() {
console.log(this.items);
}
}
function deleteMid(stack, middle = Math.round(stack.items.length / 2)) {
if (stack.isEmpty()) return;
const isMiddle = stack.items.length === middle;
// Remove last item
const x = stack.pop();
// stop when you get to the middle
if (isMiddle) return;
// Remove other items
deleteMid(stack, middle);
// add the item back
stack.push(x);
}
var stack = new Stack();
stack.push(1);
stack.push(2);
stack.push(3);
stack.print();
deleteMid(stack);
stack.print();
答案 1 :(得分:1)
您的实现遗漏了Python实现的某些部分:
您有一个隐式全局x
变量-与Python不同,在Javascript中,声明时未使用var
/ let
/ const
的变量被分配给全局对象,因此一次递归deleteMid
完成后,每次只有一个名为x
的变量(而不是每次迭代都使用一个变量)。请改用const x
,以确保每个deleteMid
的调用都具有自己的绑定x
。
您的堆栈没有length
属性,因此您的curr != Math.floor(stack.length/2)
测试结果为curr != NaN
-这不是您想要的。尽管您可以给stack
一个length
的getter属性:
get length() {
return this.items.length;
}
这仍然不符合Python实现,该实现连续递归地传递初始长度,作为另一个参数:如果您想模仿Python实现,也可以使用{{1 }}变量:
n
检查function deleteMid(stack, n, curr) {
// ...
// Remove other items
deleteMid(stack, n, curr + 1);
// Put all items back except middle
if (curr != Math.floor(n / 2)) {
// ...
// Call with:
deleteMid(stack, stack.items.length, 0);
属性的问题是,它会在迭代过程中更改 ,这会使处理起来变得更加困难。
出于相同的原因,为了使即使大小的堆栈都能工作,我们还需要在此处更改您的JS测试:
length
对应于Python代码:
if (stack.isEmpty() || curr == stack.items.length) {
工作代码:
if (st.isEmpty() or curr == n) :