Javascript 堆栈中的中间元素

Javascript 堆栈中的中间元素,javascript,data-structures,stack,Javascript,Data Structures,Stack,我在Geeksforgeks网站上阅读了关于javascript和python中堆栈实现的文章。我实现了删除javascript中堆栈中间元素的代码,与同一网站中python的代码完全相同。但我得到了错误的答案。为什么会这样?在这种情况下,两种语言之间有什么区别?如何在javascript中获得正确答案?下面是Javascript中的代码 类堆栈{ 构造函数(){ 此参数为.items=[]; } 推动(元件){ 此.items.push(元素); } 流行音乐(){ if(this.item

我在Geeksforgeks网站上阅读了关于javascript和python中堆栈实现的文章。我实现了删除javascript中堆栈中间元素的代码,与同一网站中python的代码完全相同。但我得到了错误的答案。为什么会这样?在这种情况下,两种语言之间有什么区别?如何在javascript中获得正确答案?下面是Javascript中的代码

类堆栈{
构造函数(){
此参数为.items=[];
}
推动(元件){
此.items.push(元素);
}
流行音乐(){
if(this.items.length==0){
返回“下溢”;
}否则{
返回此.items.pop();
}
}
peek(){
返回此.items[this.items.length-1];
}
isEmpty(){
返回this.items.length==0;
}
打印(){
console.log(this.items);
}
}
函数deleteMid(堆栈,当前){
//如果堆栈为空或所有项
//横穿
if(stack.isEmpty()| curr==stack.items.length){
返回;
}
//删除最后一项
x=stack.peek();
stack.pop();
//删除其他项目
deleteMid(堆栈,当前+1);
log(“长度值:”,stack.items.length);
//把所有的东西放回去,中间的除外
if(curr!=数学地板(stack.length/2)){
堆栈推送(x);
}
}
var stack=新堆栈();
堆栈推送(1);
栈推(2);
堆栈推送(3);
stack.print();
deleteMid(堆栈,0);

stack.print()由于开始时知道中间索引,因此可以在删除每个项目后检查堆栈的长度,并在到达中间时停止

类堆栈{
构造函数(){
此参数为.items=[];
}
推动(元件){
此.items.push(元素);
}
流行音乐(){
if(this.items.length==0){
返回“下溢”;
}否则{
返回此.items.pop();
}
}
peek(){
返回此.items[this.items.length-1];
}
isEmpty(){
返回this.items.length==0;
}
打印(){
console.log(this.items);
}
}
函数deleteMid(stack,middle=Math.round(stack.items.length/2)){
if(stack.isEmpty())返回;
const isMiddle=stack.items.length==middle;
//删除最后一项
const x=stack.pop();
//到中间时停下来
如果(isMiddle)返回;
//删除其他项目
deleteMid(堆栈,中间);
//将项目添加回
堆栈推送(x);
}
var stack=新堆栈();
堆栈推送(1);
栈推(2);
堆栈推送(3);
stack.print();
deleteMid(stack);

stack.print()您的实现遗漏了Python实现的某些部分:

您有一个隐式全局
x
变量-与Python不同,在Javascript中,未声明
var
/
的变量将
/
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实现不断递归地传递初始长度,这是另一个参数:如果要模拟Python实现,也可以使用
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);
检查
length
属性的问题是,它会在您迭代时发生更改,这将使处理变得更加困难

出于同样的原因,为了使大小相同的堆栈也能工作,我们还需要在此处更改您的JS测试:

if (stack.isEmpty() || curr == stack.items.length) {
要与Python代码相对应,请执行以下操作:

if (st.isEmpty() or curr == n) :
工作代码:

类堆栈{
构造函数(){
此参数为.items=[];
}
推动(元件){
此.items.push(元素);
}
流行音乐(){
if(this.items.length==0){
返回“下溢”;
}否则{
返回此.items.pop();
}
}
peek(){
返回此.items[this.items.length-1];
}
isEmpty(){
返回this.items.length==0;
}
打印(){
console.log(this.items);
}
获取长度(){
返回此.items.length;
}
}
函数deleteMid(堆栈,n,curr){
//如果堆栈为空或所有项
//横穿
if(stack.isEmpty()| curr==n){
返回;
}
//删除最后一项
const x=stack.peek();
stack.pop();
//删除其他项目
deleteMid(堆栈,n,curr+1);
//把所有的东西放回去,中间的除外
如果(当前!=数学楼层((n)/2)){
堆栈推送(x);
}
}
var stack=新堆栈();
堆栈推送(1);
栈推(2);
堆栈推送(3);
stack.print();
deleteMid(stack,stack.items.length,0);

stack.print()
你能把你得到的输出也发布出来吗?我现在已经添加了输入和输出。谢谢。明白了!我以前尝试过这种方法,但没有得到正确的答案。我仍然在习惯Javascript的编程方式!你能解释一下这一行发生了什么吗?const isMiddle=stack.items.length==middle;`stack.items.length==middle`是一个布尔表达式(返回
true
false
),表达式的结果被分配给
isMiddle
。好的!谢谢!明白了。这就像返回true或false并分配值一样。感谢您的解释。我没有传递参数“n”的原因是我认为stack.items.length将保持不变,因此我只能传递stack和index参数卢比。