【数据结构与算法设计】上机课习题三

第三章作业
一、选择题1,3,4,5,6,7,9,11,13
二、填空题2,3,4,5,6,7,8,10
三、算法设计题2,3

一、选择题1,3,4,5,6,7,9,11,13

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
1.对于栈操作数据的原则是()
A.先进先出 B.后进先出 C.后进后出 D.不分顺序

B.后进先出

3.一个栈的输入序列为1,2,3,…,n,若输出序列的第一个元素是n,输出的第i(1<=i<=n)个元素是()
A.不确定 B.n-i-1 C.i D.n-1

B
按照堆栈“后进先出”的特点,n是最后一个入栈的,即n为栈顶元素。若输出的第一个元素为n,则其余所有元素必定仍在堆栈中。第一个输出元素为n,则第二个输出元素为n-1,第i个输出元素为n-i+1,最后一个(第n个)输出元素为1。

4.一个栈的输入序列为1,2,3,…,n,若输出序列的第一个元素是i,则第j个输出元素是()
A.i-j-1 B.i-j C.j-i+1 D.不确定

D

在这里插入图片描述

5.若已知一个栈的入栈序列为1,2,3,…,n,若输出序列为 p 1 , p 2 , p 3 , . . . , p n p_1,p_2,p_3,...,p_n p1,p2,p3,...,pn,若 p n p_n pn是n,则 p i p_i pi是()
A.1 B.n-i C.n-i+1 D.不确定

D.不确定

6.有6个元素6,5,4,3,2,1顺序入栈,下列不是合法的出栈序列是()
A.5,4,3,6,1,2
B.4,5,3,1,2,6
C.3,4,6,5,2,1
D.2,3,4,1,5,6

B

7.设栈的输入序列是1,2,3,4,则()不可能是其出栈序列。
A.1,2,4,3
B.2,1,3,4
C.1,4,3,2
D.4,3,1,2
E.3,2,1,4

D

9.设一个栈的输入序列是1,2,3,4,5,则下列序列中是栈的合法输出序列的是()
A.5,1,2,3,4
B.4,5,1,3,2
C.4,3,1,2,5
D.3,2,1,5,4

D

11.设a,b,c,d,e,f以所给的次序入栈,若在入栈操作时,允许出栈操作,则下面得不到的序列为()
A.f,e,d,c,b,a
B.b,c,a,f,e,d
C.d,c,e,f,b,a
D.c,a,b,d,e,f

D

13.输入序列为A,B,C,变为C,B,A时经过的栈操作为()
A.push,pop,push,pop,push,pop
B.push,push,push,pop,pop,pop
C.push,push,pop,pop,push,pop
D.push,pop,push,push,pop,pop

B

二、填空题2,3,4,5,6,7,8,10

在这里插入图片描述
2.栈是一种特殊的线性表,允许插入和删除运算的一端称为(栈顶),不允许插入和删除运算的一端称为(栈底)
3.(队列)是被限定为只能在表的一端进行插入运算、在表的另一端进行删除运算 的线性表
4.在一个循环队列中,队首指针指向队首元素的(前一个)位置
5.在具有n个单元的循环队列中,队满时共有(n-1)个元素。

因为如果放置n个元素,首尾指针指向同一位置,与空队列无法区别,所以循环队列中认为当尾指针的后一个指针为首指针时,判定队列为满队列,即只能保存n-1个元素。

6.向栈中压入元素的操作是先(移动栈顶指针),后(存入元素)
7.从循环队列中删除一个元素,其操作是先(取出队头元素 ),后(移动队头指针)
8.顺序栈用data[1…n]存储数据,栈顶指针是top,则值为x的元素入栈的操作是(data[++top]=x;)

10.引入循环队列的目的是为了克服(假溢出)

三、算法设计题2,3

在这里插入图片描述
2.堆栈在计算机语言的编译过程中用来进行语法检查,试编写一个算法,检查一个字符串中的花括号、方括号和圆括号是否配对,若能够全部配对则返回逻辑真,否则返回逻辑假。

def is_valid_parentheses(s):
    stack = []
    mapping = {')': '(', ']': '[', '}': '{'}
    
    for char in s:
        if char in mapping.values():  # 左括号入栈
            stack.append(char)
        elif char in mapping.keys():  # 右括号
            if not stack:  # 栈为空,即右括号多于左括号
                return False
            top_element = stack.pop()
            if mapping[char] != top_element:  # 右括号与栈顶元素不匹配
                return False
        else:  # 忽略非括号字符
            continue
    
    return not stack  # 栈为空则所有括号匹配,否则左括号多于右括号

# 测试
print(is_valid_parentheses("()"))  # True
print(is_valid_parentheses("()[]{}"))  # True
print(is_valid_parentheses("(]"))  # False
print(is_valid_parentheses("([)]"))  # False
print(is_valid_parentheses("{[]}"))  # True

3.斐波那契数列的第n项用Fib(n)表示,则计算公式如下:
Fib(n)=n-1(n=1 或 2)
Fib(n)=Fib(n-1)+Fib(n-2)(n>2)
试编写出计算Fib(n)的递归算法和非递归算法

递归算法:

def fibonacci_recursive(n):
    if n <= 0:
        return "输入的n必须大于0"
    elif n == 1 or n == 2:
        return n - 1
    else:
        return fibonacci_recursive(n - 1) + fibonacci_recursive(n - 2)

# 测试
print(fibonacci_recursive(1))  # 输出: 0
print(fibonacci_recursive(2))  # 输出: 1
print(fibonacci_recursive(5))  # 输出: 3
print(fibonacci_recursive(10)) # 输出: 34

非递归算法:

def fibonacci_iterative(n):
    if n <= 0:
        return "输入的n必须大于0"
    elif n == 1 or n == 2:
        return n - 1
    
    fib = [0, 1]
    for i in range(2, n):
        fib.append(fib[-1] + fib[-2])
    return fib[-1]

# 测试
print(fibonacci_iterative(1))  # 输出: 0
print(fibonacci_iterative(2))  # 输出: 1
print(fibonacci_iterative(5))  # 输出: 3
print(fibonacci_iterative(10)) # 输出: 34

  • 16
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python 上机题库是一种集合了各种难度级别的 Python 编程题目的资源。它主要用于帮助学习者在实践中巩固和提高他们的 Python 编程能力。上机题库可以包含不同类型的题目,例如算法题、数据结构题、面向对象编程题等。 Python 上机题库的应用非常广泛。对于初学者来说,通过做题目可以加深对 Python 语言基础知识的理解,掌握基本的编码技巧,提高编程思维能力。对于进阶者来说,通过解决更加复杂的问题和挑战,可以拓宽知识面并提高解决问题的能力。同时,上机题库还可以作为考试和面试准备的工具,帮助学习者了解应用场景和解决实际问题的能力。 一个好的上机题库需要具备以下特点:题目涵盖广泛,包括各个主题和难度级别;有详细的题目描述和输入输出要求,使学习者能够清晰地理解问题和解题思路;提供测试用例,方便学习者验证代码的正确性;给出参考答案和思路解析,帮助学习者分析和理解优质的解决方法。 Python 上机题库的使用方法也比较简单。学习者可以根据自己的水平选择合适的题目进行练习。在解题过程中,可以通过尝试不同的思路和算法,提高解决问题的策略;也可以参考题目的参考答案,学习别人的解决思路和编码技巧,从中汲取经验。此外,可以尝试与他人合作完成一些复杂的题目,通过交流和讨论来共同提高。 总之,Python 上机题库是一个非常有价值的学习资源,可以帮助学习者提高 Python 编程能力、应对复杂问题和提升解决问题的能力。通过不断练习和实践,学习者能够逐渐掌握更加高级的编程技能,为未来的学习和工作打下坚实的基础。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值