在javascript中从堆栈弹出原型会导致未定义

时间:2015-12-07 13:52:57

标签: javascript data-structures stack

我试图在网页上展示一些搜索算法。 DFS,BFS和A *。最终目标是让用户单击网格框并观察搜索功能在搜索时点亮网格图块。我有问题让我的数据结构在Javascript中正常工作。所以这是我的Stack原型。

function Stack()
{
    this._size = 0;
    this._stack = {};
}
Stack.prototype.push = function(node)
{
    var size = this._size++;
    this._stack[size] = node;
}
Stack.prototype.pop = function()
{
    var size = this._size;
    if(size > 0)
    {
        var popped = this._stack[size];
        delete this._stack[size];
        this._size--;
        return popped;
    }
}
Stack.prototype.isEmpty = function()
{
    var size = this._size;
    return size <= 0;
}
Stack.prototype.stringify = function()
{
    var size = this._size
    var str = "Stack:"+ this._size + ":{";
    if(size > 0)
    {
        for(var i = 0; i < size; i++)
        {
            str = str + this._stack[i].stringify();
            if(i+1 < size)
            {
                str = str + ", ";
            }
            else
            {
                str = str + "}";
            }
        }
    }
    else
    {
        str = str + "Empty}";
    }
    return str;
}

这是我正在推动并弹出以

进行测试的原型
function TILE(x, y, w, h, id)
{
    this._x = x;
    this._y = y;
    this._w = w;
    this._h = h;
    this._id = id;
}
TILE.prototype.X = function(){return this._x;}
TILE.prototype.Y = function(){return this._y;}
TILE.prototype.WIDTH = function(){return this._w;}
TILE.prototype.HEIGHT = function(){return this._h;}
TILE.prototype.ID = function(){return this._id;}
TILE.prototype.stringify = function()
{
    var str = "Tile:"+this._id;
    return str;
};

这是我的测试功能。

function testStack()
{
    var s = new Stack();
    console.log(s.stringify());
    s.push(new TILE(10, 10, 15, 15, 69));
    console.log(s.stringify());
    s.push(new TILE(10, 10, 15, 15, 70));
    console.log(s.stringify());
    var thing = s.pop();
    console.log(s.stringify());
    console.log(thing.stringify());
}

这是我的控制台输出

Stack:0:{Empty}
Stack:1:{Tile:69}
Stack:2:{Tile:69, Tile:70}
Stack:1:{Tile:69}
TypeError: thing is undefined

我对Javascript有点新鲜。我理解它并不是一种面向对象的语言,但它让我觉得堆栈工作正常,直到我尝试设置“弹出”#39;在TILE.js.任何人都可以告诉我这里发生了什么?可以像这样使用Javascript原型吗?

1 个答案:

答案 0 :(得分:2)

问题在于你增加&#34;指针的方式&#34; size(或者更确切地说,它是你以后如何使用&#34;指针&#34;我们很快就会看到的):

var size = this._size++;
this._stack[size] = node;

您正在使用后缀增量运算符(++),这意味着在这种情况下size在增加之前获取this._size的值。将某些内容推送到您的堆栈后this._size将为1,并且支持您的堆栈的对象将具有单个属性0

当您尝试从堆栈弹出时,这就是您所做的:

var size = this._size;
if(size > 0)
{
    var popped = this._stack[size];
    delete this._stack[size];
    this._size--;
    return popped;
}

还记得我们刚刚确定this._size1吗?这就是问题所在。 this._stack对象没有1的密钥。您可以从pop方法中的大小中减去一个来修复它:

var size = this._size - 1;
if(size > 0)
{
    var popped = this._stack[size];
    delete this._stack[size];
    this._size--;
    return popped;
}