第三章-栈、队列、数组

1.假设栈初始为空,将中缀表达式  转换为等价后缀表达式的过程中,当扫描到f时,栈中的元素依次是 (B)

  • +(*-
  • +(-*
  • /+(*-*
  • /+-*
  • 解:

    基本概念:

    在中缀变后缀时,操作数的顺序不会发生变化,只有运算符的顺序可能发生变化。同时又没有括号。所以在转换的过程中,只要碰到操作数,可以直接输出,而遇到运算符和括号进行相应的处理即可。

    转换原则如下:

    1.从左到右读取一个中序表达式。

    2.若读取的是操作数,则直接输出。

    3.若读取的是运算符,分三种情况。

    A.该运算符为左括号( ,则直接存入堆栈。

    B.该运算符为右括号),则输出堆栈中的运算符,直到取出左括号为止。

    C.该运算符为非括号运算符,则与堆栈顶端的运算符做优先权比较,若较堆栈顶端运算符高或者相等,则直接存入堆栈;若较堆栈顶端运算符低,则输出堆栈中的运算符。

    4.当表达式已经读取完成,而堆栈中尚有运算符时,则依次序取出运算符,直到堆栈为空,由此得到的结果就是中缀表达式转换成的后缀表达式。


  • 2.循环队列放在一维数组A[0…M-1]中,end1指向队头元素,end2指向队尾元素的后一个位置。假设队列两端均可进行入队和出队操作,队列中最多能容纳M-1个元素。初始时为空。下列判断队空和队满的条件中,正确的是 A  

  • 队空:end1 == end2;                                  队满:end1 == (end2+1)mod M
  • 队空:end1 == end2;                                  队满:end2 == (end1+1)mod (M-1)
  • 队空:end2 == (end1+1)mod M;     队满:end1 == (end2+1)mod M
  • 队空:end1 == (end2+1)mod M;    队满:end2 == (end1+1)mod (M-1)
  •  

    解析:

    end1指向队头元素,那么可知出队的操作是先从A[end1]读数,然后end1再加1。end2指向队尾元素的后一个位置,那么可知入队操作是先存数到A[end2],然后end2再加1。若把A[0]储存第一个元素,当队列初始时,入队操作是先把数据放到A[0],然后end2自增,即可知end2初值为0;而end1指向的是队头元素,队头元素的在数组A中的下标为0,所以得知end1初值也为0,可知队空条件为end1==end2;然后考虑队列满时,因为队列最多能容纳M-1个元素,假设队列存储在下标为0到下标为M-2的M-1个区域,队头为A[0],队尾为A[M-2],此时队列满,考虑在这种情况下end1和end2的状态,end1指向队头元素,可知end1=0,end2指向队尾元素的后一个位置,可知end2=M-2+1=M-1,所以可知队满的条件为end1==(end2+1)mod M,选A。

    注意:考虑这类具体问题时,用一些特殊情况判断往往比直接思考问题能更快地得到答案,并可以画出简单的草图以方便解题。

  • 3.已知循环队列存储在一维数组A[0...n-1]中,且队列非空时front和rear分别指向队头元素和队尾元素。若初始时队列为空,且要求第1个进入队列的元素存储在A[0]处,则初始时front和rear的值分别是(B)。

  • 0,0
  • 0,n-1
  • n-1,0
  • n-1,n-1

这题和上题区别就是rear指向队尾元素,而不是队尾元素的下一个元素

4.设有下图所示的火车车轨,入口到出口之间有n条轨道,列车的行进方向均为从左至右,列车可驶入任意一条轨道。现有编号为1~9的9列列车,驶入的次序依次是8,4,2,5,3,9,1,6,7。若期望驶出的次序依次为1~9,则n至少是 C 

  • 2
  • 3
  • 4
  • 解析:1最先出,所有1在一个轨道的开始

5.

解析:

三对角矩阵如下图所示:

采用压缩存储,将3条对角线上的元素按行优先方式存放在一维数组B中,且a1,1存放于B[0]中,其存储形式如下所示:

可以计算矩阵A中3条对角线上的元素ai,j(1≤i,j≤n,|i-j|≤1)在一维数组B中存放的下标为k=2i+j-3。

解法一:针对该题,仅需将数字逐一带到公式里面即可:k=2*30+30-3=87,结果为87。

解法二:观察上图的三对角矩阵不难发现,第一行有两个元素,剩下的在元素m30,30所在行之前的28行(注意下标1≤i≤100、1≤j≤100)中每行都有3个元素,而m30,30之前仅有一个元素m30,29,那么不难发现元素m30,30在数组N中的下标是:2+28*3+2-1=87。

【注意】矩阵和数组的下标是从0或1开始的(如矩阵可能从a0,0或a1,1开始,数组可能从B[0]或B[1]开始),这时就需要适时调整计算方法(这个方法无非是针对上面提到的公式k=2*i+j-3多计算1或少计算1的问题)。

猜你喜欢

转载自blog.csdn.net/u011587070/article/details/82526121
今日推荐