博客作业03--栈和队列

1.学习总结

1.1 写出你认为本周学习中比较重要的知识点关键词,如逻辑结构、栈、队列、存储结构等。

  • 逻辑结构有四种基本类型:集合结构、线性结构、树状结构和网络结构。表和树是最常用的两种高效数据结构,许多高效的算法能够用这两种数据结构来设计实现。表是线性结构的(全序关系),树(偏序或层次关系)和图(局部有序(weak/local order))是非线性结构。
  • 顺序存储方法它是把逻辑上相邻的结点存储在物理位置相邻的存储单元里,结点间的逻辑关系由存储单元的邻接关系来体现,由此得到的存储表示称为顺序存储结构。顺序存储结构是一种最基本的存储表示方法,通常借助于程序设计语言中的数组来实现。
  • 链接存储方法它不要求逻辑上相邻的结点在物理位置上亦相邻,结点间的逻辑关系是由附加的指针字段表示的。由此得到的存储表示称为链式存储结构,链式存储结构通常借助于程序设计语言中的指针类型来实现。
  • 栈(stack)又名堆栈,它是一种运算受限的线性表。其限制是仅允许在表的一端进行插入和删除运算。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素,栈也称为后进先出表。
  • 队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。队列中没有元素时,称为空队列。
    队列的数据元素又称为队列元素。在队列中插入一个队列元素称为入队,从队列中删除一个队列元素称为出队。因为队列只允许在一端插入,在另一端删除,所以只有最早进入队列的元素才能最先从队列中删除,故队列又称为先进先出(FIFO—first in first out)线性表。

1.2 使用思维导图将这些关键词组织起来。

2.PTA实验作业

2.1 题目1:jmu-字符串是否对称

2.2 设计思路(伪代码或流程图)

    for i=0 to str[i]=='\0'
        将字符出栈赋予e
        将e与字符不等,输出no,删除队列并退出程序
    输出yes

2.3 代码截图

2.4 PTA提交列表说明。

  • 编译错误,原因:没有用c++。

2.1 题目2:jmu-报数游戏

2.2 设计思路

    定义k=1
    while q非空
        队列元素出队赋予j
        若k==3 输出j k=1 继续循环
        队列元素继续出栈
        k++

2.3 代码截图

2.4 PTA提交列表说明。

  • 编译错误,原因:没有用c++。

2.1 题目3:银行业务队列简单模拟

2.2 设计思路(伪代码或流程图)

    定义队列a,b
    for i=0 to n
        输入m
        若m为偶数入b列,否则入a列
    flag=1
    while a,b非空
        若flag为真 
            flag=0
            将a队首元素进数组c并出队,再重复一次
        否则
            将b对首元素进数组c并出队,flag=1
    将a或b剩余元素一一进数组c

2.3 代码截图

2.4 PTA提交列表说明。

  • 格式错误,原因:最后一个编号后不能有多余的空格。

3.截图本周题目集的PTA最后排名


  • 本次2个题目集总分:99+108=207分
  • 必做题共:164分

4. 阅读代码

  • 0-1背包问题:
    给定n种物品和一个背包。物品i的重量是Wi,其价值为Vi,背包的容量为C。应如何选择装入背包的物品,使得装入背包中物品的总价值最大?
    在选择装入背包的物品时,对每种物品i只有2种选择,即装入背包或不装入背包。不能将物品i装入背包多次,也不能只装入部分的物品i。
  • 背包问题:
    与0-1背包问题类似,所不同的是在选择物品i装入背包时,可以选择物品i的一部分,而不一定要全部装入背包,1 <= i <= n。
    这2类问题都具有最优子结构性质,极为相似,但背包问题可以用贪心算法求解,而0-1背包问题却不能用贪心算法求解。
    用贪心算法解背包问题的基本步骤:
    首先计算每种物品单位重量的价值Vi/Wi,然后,依贪心选择策略,将尽可能多的单位重量价值最高的物品装入背包。若将这种物品全部装入背包后,背包内的物品总重量未超过C,则选择单位重量价值次高的物品并尽可能多地装入背包。依此策略一直地进行下去,直到背包装满为止。
void Knapsack(int n,float M,float v[],float w[],float x[])
{
  Sort(n,v,w);
  int i;
  for (i = 1 ; i <= n ; i++) 
    x[i] = 0;
    float c=M;
    for (i=1;i<=n;i++) {
      if (w[i] > c) break;
    x[i]=1;
    c-=w[i];
  }
  if (i <= n) x[i]=c / w[i];
}
  • 算法knapsack的主要计算时间在于将各种物品依其单位重量的价值从大到小排序。因此,算法的计算时间上界为 O(nlogn)。为了证明算法的正确性,还必须证明背包问题具有贪心选择性质。
    对于0-1背包问题,贪心选择之所以不能得到最优解是因为在这种情况下,它无法保证最终能将背包装满,部分闲置的背包空间使每公斤背包空间的价值降低了。事实上,在考虑0-1背包问题时,应比较选择该物品和不选择该物品所导致的最终方案,然后再作出最好选择。由此就导出许多互相重叠的子问题。这正是该问题可用动态规划算法求解的另一重要特征。实际上也是如此,动态规划算法的确可以有效地解0-1背包问题。

5. 代码Git提交记录截图

posted @ 2018-04-14 21:35  做人要有疯度  阅读(261)  评论(1编辑  收藏  举报