PTA 数据结构第5次练习-栈和队列(基础篇)

一:判断题


答案是 : F

解析:栈的特点是先进后出,后进先出,先进入了1 2,又出去了栈顶的元素2,栈里面还有1,然后又进入了3,又出去了栈顶元素3,此时栈里面还有一个元素,然后再执行出栈操作,出栈1,然后出栈的序列为 2 3 1 所以答案是错误滴。

答案是:F

解析:栈是一种先进后出的数据结构,如果进栈的顺序是123,那么出栈的顺序是321,题目中给的序列1,2,3,.....N是公差为1的等差数列,出栈的话是N,N-1,3,2,1,这个是一个公差为-1的等差数列,如果求第j个的话;也就是aj=i+(j-1)*-1,第j个输出元素是i-j+1.

可以测试一下,假如输入序列是1 2,如果输出的第一个元素是i,i等于2,那么第2个输出元素就是2-2+1=1;输出的是1。

答案是:T

解析:如果先进入栈里面的是1 2 3,那么如果出栈的话是3先出栈,然后4再进栈,4再出栈,栈里面还有1 2两个元素,只能2先出栈,再1出栈,不能颠倒顺序,因为栈是一种先进后出的数据结构

答案是:F

解析:循环队列是一个抽象的数据结构,而单向循环链表或循环数组是具体的实现方式,不是数据结构本身。

答案是:F

解析:当队列满时,进入循环队列时,front是可能大于rear

二:选择题


答案是:A

解析:栈是一种先进后出的数据结构,如果进栈顺序是1 2 3 4 5

我们看A选项,1 2 3先进栈,然后3 2 1出栈,这是没问题的,然后4 5再进栈,5 4再出栈,所以A是没问题滴

我们看B选项, 如果5先出栈的话,那栈里面肯定是有1 2 3 4 5,那么这个出栈顺序是5 4  3 2 1,所以B是不对滴

我们看C选项,先出的是4,说明原来栈里面是有1 2 3 4,然后再进入5,再出去,此时栈里面只有1 2 3了,如果依次出栈的话只能是3 2 1不是1 3 2,所以C也是不对滴

我们看D选项,先出的是4,然后再出3,再出2,1,所以D也是不对滴.

答案是:B

解析:栈是一种先进后出的数据结构,如果进栈顺序是6 5 4 3 2 1

我们看A选项,先进栈6 5 4 3 2,然后2出去,3再出去,4再出去,再进入1,1出去,此时栈里面还有6 5两个元素,按照后进先出, 5 6依次出去,A肯定是没问题滴

我们看B选项,先进栈6 5 4 3,然后3 出去,4 再出去,5再出去,6再出去,所以B选项是错误的

我们看C选项,先进栈65 ,然后5先出去,4 进入,再出去,3进入再出去,然后6出去,2 1再依次入栈,出栈,所以C也是没问题滴

我们看D选项,先进栈6 5 4,然后4 5出栈,再进栈3,再出去,然后再进栈2 1,再依次出去,最后只剩下6,然后出栈,D也是没问题滴.

答案是:D

解析:如果是全进栈,然后再出栈的话:题目中给的序列1,2,3,.....N是公差为1的等差数列,出栈的话是N,N-1,3,2,1,这个是一个公差为-1的等差数列,如果求第j个的话;也就是aj=i+(j-1)*-1,第j个输出元素是i-j+1.

但是如果是进一个出一个再进进出出的,这种就不是了,所以答案是不确定

答案是:C

解析:栈是一种先进后出的数据结构,如果进栈的顺序是123,那么出栈的顺序是321,题目中给的序列1,2,3,.....N是公差为1的等差数列,出栈的话是N,N-1,3,2,1,这个是一个公差为-1的等差数列,如果求第j个的话;也就是aj=i+(j-1)*-1,第j个输出元素是i-j+1.答案是:C

解析:用数学公式,只看000就可以,ps是固定的都是进一个出一个,最后根据公式算出20/4=5;

答案是:D

解析:如果第一个出栈的元素是4,就说明栈里面已经有1 2 3 4是个元素了,如果先出了4,再进入5,再出去,最后一个出栈的元素必定是1,如果一开始把栈里面的4个元素都出去,再进去5,再出去。最后一个出栈的就是5,所以是1或者5

答案是:C

解析是:p2等于n,说明n第二个出栈的,所以第1个出栈的可能是 1 2 3  4 5 n-1种

答案:C

解析:ab 进栈,此时栈内2个元素,b再出栈,

c,d进栈,此时栈内3个元素,然后d c出栈,

然后e f进栈,此时栈内3个元素,然后f 出栈,e出栈,

然后a出栈,此时栈内没有元素

然后g进栈,此时栈内1个元素

所以栈s的容量至少为3;

答案:D

解析:这道题就找连续三次就行退栈的就行

选项D,a进去出去以后,又进入了b c d e f,然后 f e d 连续三次退栈

答案是:C

解析:先进栈1 2 3此时栈内元素个数是3,然后3出栈,

然后4 5进栈,此时栈内是1 2 4 5,栈的大小是4

答案是:C

解析:3直接加入后缀表达式,然后遇到*操作符,执行入栈p的操作,然后2加入到后缀表达式,然后遇到+号,*号运算符执行出栈O的操作(因为*号的优先级大),加入到后缀表达式,+号运算符执行入栈p的操作,然后8加入到后缀表达式,然后/号执行入栈(p)的操作,然后4加入到后缀表达式中,然后依次出栈,把/号出栈放在后缀表达式中,再把+号出栈放在后缀表达式中,所以最后的顺序是poppoo

答案:B

解析:首先a先放在后缀表达式中,然后+入栈,然后把b放在后缀表达式中,然后*入栈,然后c放在后缀表达式中,然后遇到加号,此时栈中的两个运算符的优先级大于或者等于+号依次出栈,然后加入到后缀表达式中,然后+进栈,遇到了界限符(,(进栈,然后d加入后缀表达式,然后*进栈,然后e加入到后缀表达式,然后+进栈,此时*的运算符是高于+号的,所以*出栈,然后就扫描到f了,加入到后缀表达式

所以最后是+(+,选B

答案是A

解析:根据定义来找就可以滴,具体不作解释

答案是C

解析:先把栈顶的元素保留,然后更新栈顶的指针到下一个位置

答案是B

解析:因为用数组来表示的,数组的下标是0到n-1,所以用-1表示为空

答案:A

解析:头指针指向表头

答案是C

解析:向这个栈插入一个元素时,修改top指针应当执行 top = top - 1。
由于栈是从数组的另一头开始存储的,所以栈顶的位置是数组的最后一个元素,即下标为 n-1。当向栈中插入一个元素时,需要将栈顶指针 top 向前移动一位,指向新插入的元素。
因此,修改 top 指针的操作应为 top = top - 1。

答案是D

解析:栈采用顺序存储方式存储时,两栈共享空间V[m],其中 top[i] 代表第 i(i=1或2)个栈的栈顶,栈1的底在 V[0],栈2的底在 V[m-1]。
栈满的条件是当栈1和栈2的栈顶指针相邻时,即 top[1] + 1 = top[2] 或 top[2] + 1 = top[1]。
这是因为栈满时,两个栈的栈顶指针相邻,表示两个栈的元素已经填满了整个共享空间,无法再插入新的元素。

答案是B

解析:这个肯定是队列,队列先进先出,符合打印机的特点

答案是B

解析:1.初始状态下,单向链表的状态是:1->2->3。
2.将对象4入队,即将对象4添加到链表的尾部。此时,单向链表的状态变为:1->2->3->4。
3.队列头的对象出队,即移除链表的头节点。此时,单向链表的状态变为:2->3->4。

答案是:D

解析:左入a:将元素a插入队列的左端,队列中的元素为:a。
右入b:将元素b插入队列的右端,队列中的元素为:a、b。
左入c:将元素c插入队列的左端,队列中的元素为:c、a、b。
左入d:将元素d插入队列的左端,队列中的元素为:d、c、a、b。
左入e:将元素e插入队列的左端,队列中的元素为:e、d、c、a、b。
现在,我们进行出队操作。根据题目要求,出队操作是在队列的右端进行。
如果我们按照出队顺序,即右端先出队,那么出队的元素应该是b、a、c、d、e。

A对

左入a:将元素a插入队列的左端,队列中的元素为:a。
右入b:将元素b插入队列的右端,队列中的元素为:a、b。
左入c:将元素c插入队列的左端,队列中的元素为:c、a、b。
右入d:将元素d插入队列的右端,队列中的元素为:c、a、b、d。
左入e:将元素e插入队列的左端,队列中的元素为:e、c、a、b、d。
现在,我们进行出队操作。根据题目要求,出队操作是在队列的右端进行。
如果我们按照出队顺序,即右端先出队,那么出队的元素应该是d、b、a、c、e。

B对

左入a:将元素a插入队列的左端,队列中的元素为:a。
左入b:将元素b插入队列的左端,队列中的元素为:b、a。
左入c:将元素c插入队列的左端,队列中的元素为:c、b、a。
右入d:将元素d插入队列的右端,队列中的元素为:c、b、a、d。
左入e:将元素e插入队列的左端,队列中的元素为:e、c、b、a、d。
现在,我们进行出队操作。根据题目要求,出队操作是在队列的左端进行。
如果我们按照出队顺序,即左端先出队,那么出队的元素应该是e、c、b、a、d。c对

D就是错的,因为a和b是紧挨着滴,中间不可能有个c滴

答案是A

解析:首先,删除两个元素意味着我们需要将front向后移动两个位置。由于是循环队列,我们需要考虑数组越界的情况。在这种情况下,我们可以使用取模运算来确保front的值在合法范围内。
删除一个元素:front = (front + 1) % 6 = (0 + 1) % 6 = 1
删除第二个元素:front = (front + 1) % 6 = (1 + 1) % 6 = 2
现在,我们将添加两个元素到队列中。由于rear表示队列中最后一个元素的下一个位置,我们需要将rear向后移动两个位置。
添加一个元素:rear = (rear + 1) % 6 = (4 + 1) % 6 = 5
添加第二个元素:rear = (rear + 1) % 6 = (5 + 1) % 6 = 0
因此,经过删除两个元素和添加两个元素的操作后,新的front的值为2,新的rear的值为0。

答案:B

解析:如果循环队列用大小为m的数组表示,并且使用队头指针front和队列元素个数size来表示队列的范围,那么这样的循环队列可以容纳的元素个数最多为m-1。
在这种表示方式下,队列的范围由front和size来确定。front表示队列的起始位置,size表示队列中元素的个数。由于是循环队列,我们需要考虑数组越界的情况,因此数组的大小为m。
循环队列的容量是m-1,而不是m,是因为我们需要一个位置来区分队列是空还是满。当队列为空时,front和size都为0;当队列满时,front和size都为m-1。因此,我们需要保留一个位置来区分这两种情况。

答案:D

解析:在循环队列中,队尾元素的位置是队头位置加上队列元素个数再减去1,然后对数组大小m取模。这是因为循环队列是环形的,当队列满时,队尾元素的下一个位置就是队头位置。

答案:C

解析:因为最后栈里面只有1和2了,所以2先出去,1再出去,而不是1先出去,2再出去

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值