﻿function Stack()
{
/*容量是变化的，最大容量由MaxSize 决定，在初始化时由第二个参数决定。初始容量和每次增长的幅度大小一样，由初始化的第一个参数决定。*/

if(isNaN(arguments[0]))
   this.Capacity = this.step = 100;   else
   this.Capacity = this.step = parseInt(arguments[0]);

if(isNaN(arguments[1]))
   this.MaxSize = 1000;
else
   this.MaxSize = parseInt(arguments[1]);
this.Pointer = 0;

var data = new Array(this.Capacity);

this.Top = function ()
{
   if (this.Empty())
    throw "堆栈为空！";
   else
    return data[this.Pointer-1];
}

this.Pop = function ()
{
   if (this.Empty())
    throw "堆栈为空！";
    //容量的减小是在当前栈顶将有（即弹出栈顶后有）长度为两倍step的空余地址时发生，每次减少一个step长度
   else if (this.Pointer + this.step * 2 - 1 <= this.Capacity)    {
    this.Capacity -= this.step;
    var newdata = new Array(this.Capacity);
    for(var i=this.Pointer-1; i>=0; i--)
     newdata[i] = data[i];
    data = newdata;
   
   }
   return data[--this.Pointer];
}

this.Push = function ( item )
{
   if( this.Pointer >= this.Capacity )
   {
    var newCapacity = this.Capacity + this.step;
    if ( newCapacity > this.MaxSize )
    {
     throw "达到最大容量，堆栈溢出";
    }
    else
    {
     this.Capacity = newCapacity;
     //容量的增加上在将溢出但未达到最大容量时发生，每次增加一个step长度
     var newdata = new Array(this.Capacity);
     for(var i = data.length - 1; i >= 0 ; i--)
      newdata[i] = data[i];
     data = newdata;
    }
   }
   data[this.Pointer++] = item;          
}

this.Empty = function ()
{
   return (this.Pointer == 0);
}

this.Clear = function ()
{
   this.Pointer = 0 
   this.Capacity = this.step;
   data = new Array(this.Capacity)
}

}
