20162327 《程序设计与数据结构》第五周学习总结

20162327 2017-2018-1 《程序设计与数据结构》第五周学习总结

教材学习内容总结

  • 1、Java接口定义了一组抽象方法,能用来将抽象数据类型概念与他的实现分开
  • 2、通过使用接口名作为返回值类型,接口机制可让方法与实现栈的具体分开
  • 3、队列元素按FIFO得方式处理——最先进入的元素最先进最先离开
  • 4、队列是保存重复编码k值的一种有效结构
  • 5、实现模拟时常用队列来表示等待的一列
  • 6、队列的链式实现方式的便于找到指向链表中的第一个和最后一个元素的引用
  • 7、入队和出队操作在集合的两端进行
  • 8、因为队列操作修改集合的两端,所以将一端固定在下表为零的位置就会让元素移动
  • 9、非循环数组实现队列是元素的移动得到O(n)阶复杂度
  • 10、采用数组实现队列时,把数组看成是一个环,可以避免移动元素
  • 11、考虑到效率,数组的实现的栈讲栈底放在下表为0的位置
  • 12、可以用对象引用变量来创建链式结构
  • 13、链表由对象组成,其中每个对象指向表中的下一个对象
  • 14、链表根据需要动态变大,本质上没有容限制
  • 15、实现带哨兵结点或虚伪结点作为第一个结点的表,可以去掉处理第一个结点这种特殊的情形
  • 16、栈的链式实现方式在链表的一端添加和删除元素

教材学习中的问题和解决过程

  • 问题1:ArrayStack类核心方法的实现(用数组实现栈)
  • 问题1解决方案:压栈方法push
public void push (T element){
     if(count == stack.length)
         expandCapacity();
     stack[count] = element;
     count ++;
  }
private void expandCapacity(){
     T[]larger = (T[])(new Object[stack.length*2]);
     for(int index=0;index<stack.length;index++)
         larger[index] = stack[index];     
     stack = larger;
}

出栈方法pop()

public T pop() throws Exception
    {
        if (count==0)
            throw new Exception("PopExpection");
        else
        count--;
        T math = stack[count];
        stack[count] = null;
        return math;
    }

peek()方法

public T peek() throws Exception
    {
        if (count==0)
            throw new Exception("PeekExpection");
        else
        return stack[count-1];
    }

  • 问题2:LinkedStack类核心方法的实现(用链表实现栈)
  • 问题2解决方案:压栈方法push()
public void push (T element)
    {
        LinearNode<T> node = new LinearNode<T> (element);
        node.setNext(top);
        top = node;
        count++;
    }

出栈方法pop()

public T pop() throws Exception
    {
        if (count==0)
            throw new Exception("PopException");
        T result = top.getElement();
        top = top.getNext();
        count--;
        return result;
    }

peek()方法

 public T peek() throws Exception
    {
        if (count==0)
            throw new Exception("PeepException");
        return top.getElement();
    }

  • 问题3:在链表中插入和删除结点该如何操作
  • 问题3解决方法:
public class Node <T>{
Node<Integer>x,y;
x = new Node<Integer>(6,null);
y = new Node<Integer>(8,null);//创建结点
y.next = x;//连接结点
z = new Node<Integer>(7,null);//再创建一个结点
z.next = x.next;
x.next = z;//将z插到x和y之间
Node<Integer>x,y,z//删除一个结点z
while (y.next != null){
      if(y.next == 7){
         x.next = y.next;
         y.next = null; 
      }
      else
         print(y.data);
         y = y.next;
  }
}

  • 问题4:哨兵结点的运用
  • 问题4解决方法:实现哨兵结点或虚伪结点作为第一个结点的表,可以处理掉第一个结点的特殊情形
head = new LinearNode<T>()//空的

作业总结

  • 1、对比数据类型、抽象数据类型和数据结构
  • 数据结构主要是用来反应一个数据的内部组成,记一个数据由哪些成分数据构成,以什么方式构成,成什么结构。
    数据类型用来刻画程序操作对象的特性,引用语多种数据结构。
    抽象数据结构和数据结构实质上是一个概念,他可以理解为数据类型的进一步抽象,即把数据类型和数据结构上的运算捆绑在一起进行封装,抽象数据类型上的定义的过程和函数以 该抽象数据类型所应具有的的数据结构为基础
  • 2、基于数组实现栈时,如果栈位于位置0处,算法应该如何处理?时间复杂度是多找?
  • 延长数组或者抛出异常
  • 3、给定五个整数(12,23,1,45,9),说明如何能够只用栈得到他的反序(9,45,1,23,12)
  • 先按顺序压如一个栈中,弹出来即可

代码托管

本周结对学习情况

20162328

其他

  • 感觉课程越来越难了,想要跟上进度需要花费更多的时间,努力吧。

学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
目标 5000行 30篇 400小时
第一周 200/200 2/2 20/20
第二周 300/500 2/4 18/38
第三周 500/1000 3/7 22/60
第四周 300/1300 2/9 30/90

参考:软件工程软件的估计为什么这么难软件工程 估计方法
(有空多看看现代软件工程 课件
软件工程师能力自我评价表
)

参考资料

posted @ 2017-10-15 23:33  小飞侠WJH  阅读(91)  评论(0编辑  收藏