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

第三章作业
一、选择题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
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值