【问题标题】:Stack operation in JavaScriptJavaScript 中的堆栈操作
【发布时间】:2010-10-12 08:19:28
【问题描述】:

我正在用 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());

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

【问题讨论】:

    标签: javascript data-structures stack


    【解决方案1】:

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

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

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

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

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

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

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

          猜你喜欢
          • 2021-03-08
          • 1970-01-01
          • 2011-09-16
          • 1970-01-01
          • 2014-05-27
          • 2020-09-26
          • 1970-01-01
          • 2023-03-09
          • 2019-09-26
          相关资源
          最近更新 更多