数据结构之堆栈——每日一练

数据结构之栈—day3

  1. 解析XML时,需要校验节点是否闭合,如必须有与之对应,用()数据结构实现比较好
    D. 栈

     解析:
     栈的应用:符号匹配;表达式求值;实现函数调用。
    
  2. 用俩个栈模拟实现一个队列,如果栈的容量分别是O和P(O>P),那么模拟实现的队列最大容量是多少?
    C. 2P+1

     解析:
     (1)大栈不能一次进太多,否则影响小栈的出栈顺序;
     (2)可以把p+2到2p+1入小栈,大栈栈底的p+1可以直接出大栈去排队。
    

在这里插入图片描述

  1. 单链表实现的栈,栈顶指针为Top(仅仅是一个指针),入栈一个P节点时,其操作步骤为:
    B. p->next = Top->next; Top->next=p;

     解析:
     单链表的栈,栈顶就是第一个节点,这里可以有两种实现:
     1、top节点表示真实的栈顶节点;
     2、top节点只是一个标识,其next才是栈顶节点。
     对于1,入栈操作是在top前插入节点:p->next = top; top = p;
     对于2,入栈操作是在top后插入节点:p->next = top->next; top->next = p;
    
  2. 下面的一些说法哪些是正确的:( BC)
    A. 缓存策略中基于 LRU 的淘汰策略,在缓存满时,会把最近进入缓存的数据先淘汰,以保持高的命中率。
    B. 中缀表达式 A+(B+C)D 的后缀表达式为 ABC+D+。
    C. 堆栈是一种 LIFO 的数据结构。
    D. 高级语言通过编译或者即时编译 (JIT) 后成为汇编语言被机器装载执行。
    E. TCP 协议和 UDP 协议都在 IP 协议之上,TCP 是面向连接的, UDP 是面向非连接的,但无论 TCP 还是 UDP 建立通信都需要一次握手,以确保对方的端口已经打开。
    F. 现代的操作系统一般都分为用户态和内核态,用户态和内核态的切换是经常发生的,程序员不需要对内核态和用户态的切换进行编程关注。

     解析:
     A:    刚好说反了,LRU的过程如下(其实很好理解,访问的频率越高越不该丢弃):
             1. 新数据插入到链表头部;
             2. 每当缓存命中(即缓存数据被访问),则将数据移到链表头部;
             3. 当链表满的时候,将链表尾部的数据丢弃。
             LRU全称是Least Recent Use,表示最近最少使用的,该思想最初用于计算机操作系统中,内存中的容量较有限,为了能更加合理的利用内存中的性能,对用户的使用作出假设,最近最少使用的越不重要,最近使用的越有可能使用到,使得该元素更容易获取到。如果元素当前容量超过了内存最大容量,则需要删除掉最近最少使用的元素。
     B:    有种简单的方法:
             1. 先将中缀表达式加括号:(A + ((B + C) * D));
             2. 再把运算符移到括号后面(前缀移到前面):(A ((B C)+ D)*)+;
             3. 把括号去掉:ABC+D*+。
     C:    LIFO:Last In First Out(后进先出)。
     D:    汇编语言也并不能被机器执行,机器可以执行的是二进制的机器语言。
     E:    TCP建立通信需要三次握手,而UDP,在传送数据前不需要先建立连接,远地的主机在收到UDP报文后也不需要给出任何确认。
     F:    这个读起来就不像对的...程序员是可以通过调用fork()函数的方式进行切换的。
    
  3. 在Windows中,下列关于堆和栈的说法中错误的是?(B)
    A. 堆都是动态分配的,没有静态分配的堆;栈有静态分配和动态分配2种分配方式。
    B. 堆的生长方向是向下的,即向着内存地址减小的方向增长;栈的生长方向是向上的,即向着内存地址增加的方向增长。
    C. 对堆的频繁new/delete会造成内存空间的不连续,从而造成大量的碎片;栈则不会存在这个问题
    D. 栈是由编译器自动治理;堆的释放工作由程序员控制,轻易产生内存泄露。

     解析:
     堆和栈的区别主要有五大点:
      1)申请方式不同:栈由系统自动分配,而堆是人为申请开辟的; 
      2)申请大小不同:栈获得的空间较小,而堆获得的空间较大;
      3)申请效率的不同:栈由系统自动分配,速度较快,而堆一般速度比较慢; 
      4)存储内容的不同:栈在函数调用时,函数调用语句的下一条可执行语句的地址第一个进栈,然后函数各个参数进栈,其中静态变量是不进栈的,而堆中一般是在头部用一个字节存放堆的大小,堆中的具体内容是人为安排的;
      5)底层不同,栈是连续的空间,而堆是不连续的空间。
    

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值