0

我正在用 JavaScript 实现一个堆栈。

考虑:

Stack{0,1,2,3} Top:0

现在用户弹出值 2:

Stack{0,1,3} Top:0

这是堆栈的可接受行为吗?我正在滚动自己的堆栈,但是是否有任何内置代码可以为我做到这一点?

我的代码:

function Stack() //Creating Stack Object
{
    // Create an empty array of cards.
    this.cards = new Array();  //Cards array inside stack object
    this.push  = pushdata;     //Call pushdata function on push operation
    this.pop   = popdata;      //Call popdata function on pop operation
    this.printStack = showStackData; //Call showStackData function on printstack operation
}

function pushdata(data)
{
    this.cards.push(data);
}

function popdata(data)
{
    return this.cards.pop();
}

function showStackData()
{
    return this.cards;
}

var a = new Stack(); //Create stack Object
a.push(12);          //Push Data onto Stack
a.push(32);
a.push(42);
var z = a.pop();
document.write("Data Popped: " + z);
document.write("Stack Output: " + a.printStack());

如果堆栈不是此应用程序的正确数据结构类型,那么正确的数据结构是什么?

4

3 回答 3

8

在堆栈中进行上述操作是否合法?

这不是传统的堆栈操作。允许您这样做的数据结构实际上不能称为堆栈;它更像是一个普通的旧列表。

如果堆栈不允许删除顶部和开始之间的数据。javascript 中用于上述逻辑的更改数据结构是什么?

一个简单的Array有什么问题吗?它为您提供所需的随机访问项目写作:

var a= [0, 1, 2, 3];
a.splice(1, 1);
// a==[0, 2, 3]

加上堆栈式便利方法,用于访问前端加载和尾部堆栈(以及因此,队列):push/pop/shift/unshift。

当 Array() 已经涵盖了 IMO 时,创建自己的 Stack() 包装类没有多大意义。虽然计算机科学家可能对堆栈链表的算法复杂性等问题感兴趣,但在实践中,您将无法从更高级别的代码改进现代 JavaScript 解释器中内置的优化数组实现。

于 2009-03-10T03:36:44.190 回答
0

不可能用 Pop 做到这一点(在此过程中不弹出其他东西)。您应该考虑为用户提供另一种方法来查找数字 2 的位置,并为用户提供另一种方法来提取它,例如使用数组拼接。但到那时,这不再是一个堆栈。

http://www.w3schools.com/jsref/jsref_splice.asp

于 2009-03-10T03:34:47.893 回答
0

如果您确实必须使用堆栈,您可以多次弹出,通过推送将弹出的数据临时存储在另一个堆栈中,然后当您完成后,执行相反的操作以将堆栈的末尾放回原位。

类似的事情通常由 GUI 应用程序中的 Undo/Redo 操作完成——它们有一个 Undo 操作堆栈和一个相反的 Redo 操作堆栈。Undo 将一个动作从堆栈 A 移动到 B,而 Redo 将一个动作从堆栈 B 移动到 A。一个新的动作压入 Undo 堆栈并完全清除 Redo 堆栈。

另一个使用它的地方是在浏览器的后退/前进列表中。

于 2009-03-10T03:41:58.203 回答