考数据库系统会用到的一些计算方法和题目整理(2)

本文详细解析了数据结构中的逆波兰式转换、循环队列、二维数组存储等概念,并介绍了算法如快速排序的具体实现方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    1、算术表达式 a+b/(c+d)*f的逆波兰式为()

计算方法:逆波兰式的算法为:

首先需要分配2个栈,一个作为临时存储运算符的栈S1(含一个结束符号),一个作为输入逆波兰式的栈S2(空栈),S1栈可先放入优先级最低的运算符#,注意,中缀式应以此最低优先级的运算符结束。可指定其他字符,不一定非#不可。从中缀式的左端开始取字符,逐序进行如下步骤:
(1)若取出的字符是操作数,则分析出完整的运算数,该操作数直接送入S2栈
(2)若取出的字符是运算符,则将该运算符与S1栈栈顶元素比较,如果该运算符优先级大于S1栈栈顶运算符优先级,则将该运算符进S1栈,否则,将S1栈的栈顶运算符弹出,送入S2栈中,直至S1栈栈顶运算符低于(不包括等于)该运算符优先级,则将该运算符送入S1栈。
(3)若取出的字符是“(”,则直接送入S1栈栈顶。
(4)若取出的字符是“)”,则将距离S1栈栈顶最近的“(”之间的运算符,逐个出栈,依次送入S2栈,此时抛弃“(”。
(5)重复上面的1~4步,直至处理完所有的输入字符
(6)若取出的字符是“#”,则将S1栈内所有运算符(不包括“#”),逐个出栈,依次送入S2栈。  
(7)运算结束后,由右至左的顺便将S2依次出栈,即得到逆波兰式  abcd+/f*+
2、在一个顺序存储的循环队列Q[0...M-1],头尾指针分别是front和rear,判断队空的条件为()判断队满的条件为()
计算方法:队列是一种只能在表的尾端进行插入操作,在首端进行删除操作的线性数据结构,  循环队列中的元素个数计算方式是 (Q.rear-q.front+QSize)%Q.Size,所以可得出,队列空为 Q.front==Q.rear,队列满为Q.front==(Q.rear+1)%M
3、设2维数组a[10][10]是对称阵,现将a中的上三角(含对角线)元素以行为主序存储在首地址为2000的存储区域,每个元素占3个单元,则元素a[6][7]的地址为()
计算方法:上三角的地址公式:loc(a[i][j])=loc(a[0][0])+((2n-i+1)*i/2+(j-i))*L)  得出a[6][7]=2228
4、在一棵三叉树中,度为3的节点数2个,度为2的节点数有1个,度为1的节点数2个,那么度为0的节点数为()
计算方法: m叉树中的叶子数=1+ m∑i=2  (i-1)ni   所以=1+(2-1)*1+(3-1)*2=6
5、一棵二叉树的节点数为18,他的最小深度为()最大深度为()
计算方法:最小深度为log2(18)+1=5,最大深度为18
6、某二叉树的前序遍历阶段访问顺序为abdgcefh 中序遍历的节点访问寻思为dgbaechf 则后序遍历访问顺序为()
计算方法:a为根,dgb为左子树,echf为右子树,左子树的前序遍历为bdg,b首先被访问可以知道b为左子树的根,与a相连
再看左子树的中序遍历dgb,d和g都在b之前就被访问
所以b和g应该在b的左子树上,形状如下
---a
--/
--b
-/
dg
而dg的确定再根据前序遍历,d先被访问,则d为根
再看中序遍历也是d先被访问,可以确定g为d的右子树
左边就可以确定出来了,一样的道理,前序遍历cefh,确定c为右子树的根,再看中序遍历echf,e为c的左子树,hf为c的右子树,hf的确定在看前序遍历f先被访问
f为根,中序遍历h先被访问,h为f的左子树,二叉树如下图 得出后序遍历为 gdbaehfca
7、假定对线性表(38,25,74,52,48)进行散列存储,采用H(K)=K%7作为散列函数,若分别采用线性探测法和链接法处理冲突,则对各自散列表进行查找的平均查找长度分别为____和______。 
计算方法: 首先,根据H(K)=K%7 计算出散列值为(3 ,4  ,4, 3 ,0), 线性探测公式:Hi=(H(K)+di)%M di=1,2,3...M-1, 二次探测再散列 di=1²,-1²,2²,-2²..±k²(k≤M/2)。,根据公式,很容易得出线性散列表 0 : 48 3 : 38 4 : 25 5 : 74,6 : 52。 ASL=1/5(1+1+2+4+1)=1.8,同理,可以计算出 二次探测的散列表 0:48 2:52 3: 38 4:25 5: 74ASL=1/5(1+1+2+3+1)=1.6
8、一组记录的关键码为(46 79 56 38 40 84)采用快速排序的方法,以第一个记录为基准得到的一次划分结果为()
计算方法:一趟快速排序的算法是:
1)设置两个变量i、j,排序开始的时候:i=0,j=N-1;
2)以第一个数组元素作为关键数据,赋值给key,即key=A[0];
3)从j开始向前搜索,即由后开始向前搜索(j--),找到第一个小于key的值A[j],将A[j]赋给A[i];
4)从i开始向后搜索,即由前开始向后搜索(i++),找到第一个大于key的A[i],将A[i]赋给A[j];
5)重复第3、4步,直到i=j; (3,4步中,没找到符合条件的值,即3中A[j]不小于key,4中A[j]不大于key的时候改变j、i的值,使得j=j-1,i=i+1,直至找到为止。找到符合条件的值,进行交换的时候i, j指针位置不变。另外,i==j这一过程一定正好是i+或j-完成的时候,此时令循环结束)。
所以很方便的算出 一次划分结果为40,38.46,56,79,84
 
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值