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