2.3.Stack Queue

Stack 在System.dll中,Stack在mscorlib 330行

但是我只考虑泛型所以需要调试System.dll

在调试符号中选择添加System.dll 符号,即可进入调试,太方便了,我爱vs

就这一点,我爱你ide

看来以后选ide的标准要换了,唯一标准是能否方便的调试代码

Stack内部

同样的动态数组
int _size;  //控制数组中指针,他是一个索引啊,指向栈顶
T[] _array; //以当前长度的2倍增长
int _num;
int _defaultCapacity 4; 
static T[] _emptyArray=new T[0]; //这就是类型变量的用法
int _version; //每次T[]中的数据改变了才递增

ctor

1. public Stack<T>(){}// _array=_emptyArray;
2. public Stack<T>(int capacity){} // _array=new T[capacity];
3. public Stack<T>(IEnumerable<T> collections){} //1.get count,then array.copyto 2.foreach

Push(T item) O(1)

public void Push(T item){
    if(_size == array.Length){  //扩容操作
        T[] newArray=new T[(_array.Length==0)?_defaultCapacity:2*_array.Length];
        Array.Copy(_array,0,newArray,0,_size);// 所以动态数组扩容也就是一个Array.Copy()而已,简单
        _array = newArray;
    }   
    _array[_size++]=item; //简单的设置值
    _version++;//这里也是一个聪明的举动,只需要4个字节,就保证了foreach的时候可以判断错误,用小代价完成大问题
}
    

Pop() O(1)

public T Pop(){
    if (_size == 0){
        throw new empty stack exception;
    }
    version ++;
    T item = _array[--size];  //倒过来从后面访问
    _array[_size] = default(T);
    return item;
}

Peek() O(1)

public T Peek() {
    if(_size==0){
        throw new empty stack exception;
    }
    return _array[_size-1];
    //不需要对size处理,不需要对version处理
}

Contains(T item) O(n)

一般对比都需要EqualityComparer.Default<T>
然后就是区分null
不是null就用Equals方法
就是一个遍历

Queue 内部 471行

为什么一直在求%,是怕超出范围
使用数组和两个指针,头尾各一个,然后都向后移动
T[] _array;
int _head;
int _tail;
int _size;

const int _DefaultCapacity = 4; 
static T[] _emptyArray = new T[0];

ctor

public Queue(){} // _empty=_emptyArray;
public Queue(int capacity){} // _array=new T[capacity];
public Queue(IEnumerable<T> collection){} //_array=new T[_DefaultCapacity], foreach {Enqueue(item);} 

Enqueue(T item) O(1)

1. 判断空Queue 抛异常
2. 扩容 SetCapacity(int newCapacity)
3. _tail=(_tail+1)%_array.Length;
    简单理解就是tail++
4. _size++;
5. version++;

Dequeue() O(1)

1. 判断空Queue 抛异常
2. remove=_array[head];
3. _array[head++]=null;
4. size--;
5. version++;

Peek() O(1)

1. 判断空Queue 抛异常
2. return _array[size];

contains O(n)

head->tail 之间遍历

Enumerator

new Enumerator(this);

转载于:https://www.cnblogs.com/zhangrCsharp/p/7695574.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值