zoukankan      html  css  js  c++  java
  • 大话数据结构读后感(一)线性表栈与队列

    3.2 线性表的定义

    3.3 线性表的抽象数据类型行:创建,销毁,增删改查等等操作

    3.4 线性表之顺序存储 :顺序表

    3.5 顺序表的插入和删除:相当于数组的插入和删除;然后把当前length +(-) 1;

      顺序表的优点:无须为表示表中的元素之间的逻辑关系而添加额外的存储空间;可以快速地访问存取表中的任意位置子的元素;

      缺点:插入和删除操作需要移动大量的元素;当线性表长度变化较大时,难以确定存储空间的容量;造成存储空间的碎片;

    3.6 线性表的链式存储结构:链表解决了顺序表的增删需要移动大量元素的问题;

    3.7 单链表的读取:next指针遍历;

    3.8 单链表的插入和删除:插入s  :      s->next=p->next;   p->next=s;   删除s:s=q; p->next=s->next; free(s);

    3.9 单链表的整表创建:(插入) 头插和尾插:尾插最后指向NULL;

    3.10 单链表的整表删除:挨个删除 : p=head->next;  while(p!=NULL) { q=p->next;   free(p) ;  p=q; }

    3.11 单链表结构与顺序结构存储结构优缺点:

    存储分配方式:顺序表存储单元连续,线性表任意存储位置;

    时间性能:顺序表方便查找;单链表适合插入和删除;

    空间性能:顺序表需预先分配存储空间,分大了浪费,分小了容易上溢; 单链表一般不需要担心内存分配问题;

    3.12 静态链表 :用数组描述的链表叫做静态链表;

      数据 +游标  数组的第一个元素的游标存放备用链表的第一个节点的下标,数组的最后一个元素的cur存放第一个有数值的元素的下标;

      静态链表的插入删除:使用第一个备用空闲的下标,把他打得下一个数组的游标用来做备用(即赋值给数组首元素的游标); 把乙位置的游标指向新元素 ,新元素的游标改为乙的游标;

      删除:将结点的游标改为数组首元素的游标;数组的首元素的游标置为1;

          静态链表的的优缺点:

      在插入和删除操作时只需要修改游标,不需要移动元素;从而改进了在顺序存储结构中的插入和删除需要移动大量元素的缺点;

      没有解决连续存储分配带来的表厂难以确定的问题;失去了顺序存储结构随机存取的特性;

    3.13 循环链表:尾不指向NULL;指向头;

    3.14 双向链表:前驱后继

    4.2 栈的定义:先进先出 

    4.4 栈的顺序存储结构及实现:进栈:s.puch_back(); s.top++; 出栈 :s.pop_back(); s.top--;

    4.5 两栈共享空间:top1+1=top2;为栈满;

    4.6 栈的链式存储结构及实现:把栈用指针连接起来;

    4.7 栈的作用:方便实用 push_back  pop_back;

    4.8 栈的应用:递归 调用的回调层次使用了栈来恢复数据;

    4.9 栈的应用 ——四则运算表达式求值;

      例如计算 9+(3-1)*3 +10/2;

      计算机会根据表达式生成后缀表达式:9 3 1 - 3 * 10 2 / +;

      所有的符号都出现在运算数字的后面;             //本例需要画图理解

      计算机根据后缀表达式 先将 931依次进栈;接下来遇到了 ‘-’;将1出栈作为减数,3作为被减数并运算3-1=2;将2进栈; 再将3进栈,接下来遇到了‘*’ ,将3和2出栈,将2*3=6进栈;接下来遇到了‘+’;将9和6出栈,将9+6=15入栈;将10入栈,将2入栈,然后遇到了‘/’;将10和2出栈,将10/2入栈;然后遇到了‘+’;将15和5出栈,15=5=20;后面表达式结束则不继续入栈;

    我们讨论了这么多都是由后缀表达式去解决的运算,那么后缀表达式又是怎么形成的呢?

      即9+(3-1)*3 +10/2   ==》 9+(3-1)*3 +10/2;是怎么运算的呢?

      初始化一空栈用来对符号进行出栈;将 9输出,将‘+’进栈,接下来是‘(’,左括号还未配对所以进栈,将3输出,将‘-’进栈;将1输出;此时遇见了 ')' 与前面的 '(' 匹配并输出两个括号之间的符号即 '-';所以现在输出的为9 3 1 - ;接着遇见 '*';因为  '+' 优先级小于 '*' ;所有不输出 '*' 进栈;接着是3输出;之后是  '+' ,此时栈顶元素 '*' 优先级比‘+' 高,因此栈中元素出栈并输出(全部出栈);然后将 '+' 入栈;将10输出,将 '/' 入栈;将2输出;将 /出栈;将 + 出栈;

      由此可以发现:

        1:将中缀转为后缀:栈用来进出运算的符号;

        2:将后缀进行运算:栈用来进出运算的数字; 

    4.10 队列的定义: 先进先出

    4.12 循环队列 :尾指向头  rear=front ;  入队: assert((q->next+1)%MAXSIZE==q->front); q->data[q->rear]=e;  q->rear=(q_rear+1)%MAXSIZE;    出队:移动front指针;

    4.13 队列的链式存储结构:把队列用指针连接起来;

  • 相关阅读:
    HDU 5313 bitset优化背包
    bzoj 2595 斯坦纳树
    COJ 1287 求匹配串在模式串中出现的次数
    HDU 5381 The sum of gcd
    POJ 1739
    HDU 3377 插头dp
    HDU 1693 二进制表示的简单插头dp
    HDU 5353
    URAL 1519 基础插头DP
    UVA 10294 等价类计数
  • 原文地址:https://www.cnblogs.com/xcb-1024day/p/11349457.html
Copyright © 2011-2022 走看看