用JavaScript进行堆栈操作

时间:2009-03-10 03:29:15

标签: javascript data-structures stack

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

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

3 个答案:

答案 0 :(得分:8)

  

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

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

  

如果stack不允许删除top和start之间的数据.javascript中用于上述逻辑的alter datastructure是什么?

简单的Array是否有问题?它为您提供了您想要的随机访问项目:

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

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

当Array()已经覆盖IMO时,制作自己的Stack()包装类没有多大意义。虽然计算机科学家可能对诸如堆栈链接列表的算法复杂性之类的事情感兴趣,但实际上,您无法从更高级别的代码中改进现有JavaScript解释器中内置的优化Array实现。

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

如果你真的必须使用堆栈,你可以弹出多次,通过推送暂时将弹出的数据存储在另一个堆栈中,然后当你完成时,反过来将堆栈的末端放回原位。

这样的事情通常是通过GUI应用程序中的撤消/重做操作完成的 - 它们有一堆撤销操作,以及相反的重做操作堆栈。撤消将操作从堆栈A移动到B,并且重做将操作从堆栈B移动到A.新操作将推送到撤消堆栈并完全清除重做堆栈。

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