cs61b proj1a part2 ArrayDeque学习记录

听课时课程里也没有提到要设定指针进行赋值,一开始就没想到这个反向,因此经历了从无指针到一个指针到最后发现需要头尾各设置一个指针进行指示的坎坷历程。

中间参考了cs61b实验记录(二)project1A,B_cs61b project1a-CSDN博客,但实际上之前没咋看懂,看懂了的时候已经自己写出来了(-_-||

完整代码如下:

public class ArrayDeque <T>{
    private int size;
    private T items[];

    /** 因为后面需要addfirst和removefirst,所以最好的方法是按照类似与c中的【-1】、【-2】。。。的index存储在list的最后
     * 因此就需要我们设置该list的头与尾
     * 就像课程里Josh Hug教授说的那个cave寓言一样,看不到就万事大吉了 ╮( ̄▽ ̄)╭
     * 因为当我们调用addFirst时需要将数据加到最后倒着加入,因此,我这里用first作为指针进行指示
     * 而last就单纯用作前面正常数列的结尾指针<( ̄︶ ̄)>
     * NOTE: last 和 first 指向的都是将填入数的位置,也就是与有数据的格子相邻的null格子
     */

    private int first;
    private int last;

    public ArrayDeque(){
        size = 0;
        items = (T[]) new Object[8];
        last = 0;
        first = items.length - 1;
    }

    public ArrayDeque(ArrayDeque other){
        size = other.size;
        items = (T[]) new Object[size];
        for(int i=0;i<size;i++)
            items[i]=(T)other.items[(other.first+i+1)%items.length];

        first = items.length-1;
        last = size;
    }

    public boolean isEmpty(){
        if(size==0)
            return true;
        return false;
    }
    private void resize(int capacity){
        T[] a = (T[]) new Object[capacity];
        for(int i=0;i<size;i++)
            a[i]=(T) items[(first+1+i)%items.length];
        items = a;
        first = items.length-1;
        last = size;
    }

    public void addLast (T n){
        if(size == items.length)            
            resize(size*2);
        items[last]=n;
        size += 1;
        last = (last+1)%items.length;
    }

    public void addFirst(T n){
        if(size == items.length)
            resize(size*2);
        items[first] = n;
        first = first==0?items.length-1:first-1;
        size++;
    }

    public T removeLast(){
        if(size==0)
            return null;
        last=last==0?items.length-1:last-1;
        T returnitem = items[last];
        items[last]=null;
        size = size-1;
        if(items.length>16&&size<items.length/4)
            resize(items.length/2);
        return returnitem;
    }

    public T removeFirst(){
        if(size==0)
            return null;
        T returnitem = items[(first+1)%items.length];
        items[(first+1)%items.length]=null;
        size -= 1;
        first = (first+1)%items.length;

        if(items.length>16&&size<items.length/4)
            resize(items.length/2);
        return returnitem;
    }

    public void printDeque(){
        for(int i=0;i<size;i++){
            System.out.print(items[(first+1+i)%items.length]+" ");
        }
    }


    public int size(){
        return size;
    }

    public T get(int idx){
        int id = (first+idx+1)%items.length;
        return items[id];
    }
}

需要注意的是,既然设定了头和尾的位置指针first和last,那么每次操作时只要把整个列表当做一个圆形的循环结构进行考虑即可适用于所有情况,而唯一的特例即是每次对first和last指针向前进行移动时如果到达边界需要重新赋值移动到list的另一端进行操作。而如果是向后进行移动,只需要使用“%list长度”得到的余数进行相应操作即可。

另外需要注意的是,proj1a项目要求中需要实现的“深度拷贝”也就是“Creating a deep copy ....”在autograde里并没有进行test(写了反倒过不了api check,会扣分),但我写都写了,就懒得再删了提交了╮( ̄▽ ̄)╭

(如果内容有问题,欢迎指出,讨论交流)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值