栈是线性表的一个特例,因为栈只能对线性表的固定一端进行插入和删除操作,对其它位置不能进行操作,也就是“后进先出”的特性,下面为栈的简单实现代码:
using System;
namespace Review
{
/// <summary>
/// 栈的实现代码
/// </summary>
public class Stack
{
private object[] _array;//存放元素的数组
private const int _defalutCapacity=10;//默认容量
private int _size;//指示元素个数
public int Count
{
get{return this._size;}
}
public Stack()
{
this._array=new object[_defalutCapacity];
this._size=0;
}
public Stack(int initialCapacity)
{
if(initialCapacity<0)
{
throw new ArgumentOutOfRangeException("栈容量不能小于0");
}
if(initialCapacity<_defalutCapacity)
{
initialCapacity=_defalutCapacity;
}
this._array=new object[initialCapacity];
this._size=0;
}
/// <summary>
/// 出栈操作
/// </summary>
/// <returns></returns>
public virtual object Pop()
{
if(this._size==0)
{
throw new InvalidOperationException("栈内已经没有数据");
}
object tmpObj=this._array[--this._size];//取栈顶元素
this._array[this._size]=null;//删除栈顶元素
return tmpObj;
}
/// <summary>
/// 进栈操作
/// </summary>
/// <param name="obj"></param>
public virtual void Push(object obj)
{
if(this._size==this._array.Length)
{
//如果空间已满,则使用新空间,并且空间容量为原来的两倍
object [] destinationArray=new object[2*this._array.Length];
Array.Copy(this._array,0,destinationArray,0,this._size);
this._array=destinationArray;
}
this._array[this._size++]=obj;
}
}
}