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的问题)。