数据结构与算法实验练习(三)(排序及线性表的应用)

news2024/12/22 23:20:53

数据结构与算法分析课下实验练习,现记录一下解答过程,欢迎大家批评指正。

声明:本题目来源于西安交通大学电信学院原盛老师,任何单位或个人在使用、转载或引用本题目时,请务必标明出处为“西安交通大学电信学院原盛老师”。

练习三:关于栈


众所周知,栈虽然是一个操作受限的线性表,但是其用途很广泛,栈的数据结构实现非常简单,因此我们只从应用层面熟悉栈。请完成下面二个子任务。
(1) 算数混合表达式计算 表达式不仅能处理整数,还需要处理小数。表达式中涉及的运算符包括+; -; ∗; ÷和 ^(指数)。表达式可以包含圆括号,且允许圆括号的嵌套,因此要处理括号匹配失败的情形。

(2) 寻找连续的股票最大走势区间 在股票市场中,需要识别股价走势中的连续时间段,这些时间段内股价表现出特定的行为模式,如连续上涨、连续下跌或是横盘整理等。这种分析对于技术分析尤为重要,它帮助交易者和投资者理解市场的动向,判断趋势的持续性或反转的可能性。给定一个记录股票价格的数组 prices,需要生成对应的 s 数组,s[i] 中记录的值为 i - j + 1,其中 i 和 j 必须要满足 prices[j::i - 1] 中的每一个值都符合 prices[j] ≤ prices[i]。s 数组中的最大值即为连续上涨的最大区间。如图 1 所示。

设计并实现一个算法完成对给定的 prices 数组上求最大连续上涨时间区间值。如果仅使用最朴实的设计思想,该算法的时间复杂和空间复杂度是多少?如果使用栈设计的算法,其时间复杂度和空间复杂度是多少?


随机生成 10 组数据完成测试。


第一问

第一小问可以这样实现:我们输入一个混合表达式(中缀),然后将其转化成后缀表达式,然后根据后缀表达式计算结果。这里要注意:避免触发计算机自带的计算机制,即我们现在假设计算机只会进行加减乘除和乘方的其中一种计算,并不会进行混合计算。 为了实现这个,我们可以以字符串的形式进行。字符串不会自己进行计算。除此之外,还有一个问题就在与小数和百位数的输入问题,如果是小数的输入那怎么才能让小数成为一个整体呢?举例而言,1.1+3*2.3 这个表达式的输入,因为我们是以字符串的形式输入的,那么如果是整数的形式输入一个索引所对应的就是一个数字。 而现在我们是小数输入,一个索引并不能表示一个小数。或者一个索引并不能表示一个两位数或更多。这里我觉得并不是此问题的关键,所以在输入时,我要求要以空格将数字和字符隔开,使用 split 方法即可以断开。这样就方便了我们的操作,让精力集中在表达式的转换和计算上。

注:输入代数式时要注意英文符号,其次每个数字和字符之间要用空格隔开

#这里先定义算术符的优先性大小,方便后续比较
f={
    '+':1,
    '-':1,
    '*':2,
    '/':2,
    '^':3,
    '(':4
}

x=input('请输入表达式(请使用英文字符,且数字和字符之间用空格隔开,只允许输入小括号):')
x=x.split()
#先检测输入的字符是否合法
kk=[]
for i in range(len(x)):
    if x[i]=='(':
        kk.append(x[i])
    if x[i]==')':
        if kk[len(kk)-1]!='(' or len(kk)==0:
            print('输入括号不匹配!!')
        else: kk.pop()
if len(kk)!=0:
    print('输入括号不匹配!!')
else:
    a=[]#用于存放后缀表达式
    b=[]#用于存放字符
    for i in range(len(x)):
        if (x[i].isdigit())or ('.' in x[i]):
            a.append(x[i])
        elif x[i]!=')':
            if x[i]=='(':
                b.append(x[i])
                f[x[i]]=0
                continue
            if len(b)==0 or f[x[i]]>f[b[len(b)-1]] or x[i]=='^':
                b.append(x[i])
                continue
            while f[x[i]]<=f[b[len(b)-1]]:
                a.append(b.pop())
                if len(b)==0: break
            b.append(x[i])
        else:
            while b[len(b)-1]!='(':
                a.append(b.pop())
            f[b[len(b)-1]]=4
            b.pop()
    if len(b)!=0:
        for i in range(len(b)):
            a.append(b.pop())
    print(a)
    #对a进行操作,计算后缀表达式
    c=[]
    for i in range(len(a)):
        if a[i]>='0' and a[i]<='9':
            c.append(a[i])
        else:
            m2=float(c.pop())
            m1=float(c.pop())
            if a[i]=='+':
                c.append(m1+m2)
            elif a[i]=='-':
                c.append(m1-m2)
            elif a[i]=='*':
                c.append(m1*m2)
            elif a[i]=='/':
                c.append(m1/m2)
            else: c.append(m1**m2)
    print(c[0])

结果输出:

正常情况下输出:

检验括号匹配情况:

第二问

首先明白 s[i]表示的含义: s[i]表示 prices 列表中第 i 个元素结尾且在它之前有多少个连续的元素比它小。
普通算法思想:从 prices[i]开始向前寻找,直到不满足条件结束,记录这个区间的长度。最后返回 s 列表以及列表中的最大值。

如果使用栈的思想:利用栈的话可以直接求得 s 数组的最大值。 其中最关键的一点在与如果从 prices[j]到 prices[i]的区间满足条件,那么不需要去查询这个区间中的任何一个元素为结尾有多大的区间长度满足条件,因为后者的区间长度必然不能大于前者的区间长度(我们要求的是最大长度)这正是优化的地方所在。(但感觉这个栈没有多大关系,不用栈也能写。)

import random
#普通
s=[]
x=[]
for i in range(10):
    x.append(random.randint(1,100))
print(x)
for i in range(len(x)):
    num=0
    k=i
    while x[i]>=x[k] and k>=0:
        num+=1
        k=k-1
    s.append(num)
print(max(s),sep='\n')
#栈的思想
stack=[]
maximum=0
i=len(x)-1
while i>=0:
    if len(stack)==0 or x[i]<=stack[0]:
        stack.append(x[i])
    else:
        if len(stack)>maximum:
            maximum=len(stack)
        stack.clear()
        stack.append(x[i])
    i-=1
if len(stack)>maximum:
    maximum=len(stack)
    
print(maximum)

结果展示:第一行是随机生成的 prices 列表,第二行和第三行输出的是两种算法得出最大区间。

时间复杂度分析: 普通思想情况下,则其时间复杂度为: O(n^2),空间复杂度为 O(1)而对于利用栈来说:它只需要扫描一遍即可得到最大值,所以它的时间复杂度为 O(n),空间复杂度为 O(n)

写作时间匆忙,如有错误请不吝赐教。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2230191.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

mac|安装redis及RedisDesk可视化软件

一、安装 通过Homebrew安装 brew install redis 在安装过程可以得到以下信息&#xff1a; 1、启动redis或重新登陆redis brew services start redis 如果只想在前端运行&#xff0c;而不是在后端&#xff0c;则使用以下命令 /opt/homebrew/opt/redis/bin/redis-server /opt…

基于hive分析Flask为后端框架echarts为前端框架的招聘网站可视化大屏项目

基于hive分析Flask为后端框架echarts为前端框架的招聘网站可视化大屏项目 1. 项目概述 项目目标是构建一个大数据分析系统&#xff0c;包含以下核心模块&#xff1a; 1、数据爬取&#xff1a;通过request请求获取猎聘网的就业数据。 2、数据存储和分析&#xff1a;使用 Hive …

Rust 力扣 - 2841. 几乎唯一子数组的最大和

文章目录 题目描述题解思路题解代码题目链接 题目描述 题解思路 我们遍历长度为k的窗口&#xff0c;用一个哈希表记录窗口内的所有元素&#xff08;用来对窗口内元素去重&#xff09;&#xff0c;我们取哈希表中元素数量大于等于m的窗口总和的最大值 题解代码 use std::coll…

Blender进阶:贴图与UV

9 UV 9.1 贴图与UV UV&#xff0c;指定每个面顶点在贴图上的坐标 演示&#xff1a; 1、添加物体 2、添加贴图&#xff0c;即图片纹理节点 3、进入UV Edit工作区 4、右边&#xff0c;选择一个面 5、左边&#xff0c;选择一个面&#xff0c;移动这个面 9.2 电子表格 电子…

UiPath调用Python脚本的完整示例

一、主要步骤&#xff1a; 1、创建Python脚本 2、安装UiPath.Python.Activities库 3、使用方法&#xff1a; a、添加python作用域 b、加载python脚本 c、调用python方法 d、获取python对象 e、显示Python结果的消息对话框 二、详细步骤 1、安装UiPath.Python.Activities库 …

[pdf,epub]105页《分析模式》漫谈合集01

105页的《分析模式》漫谈合集第1集的pdf、epub文件&#xff0c;已上传到本账号的CSDN资源。 如果无法下载&#xff0c;也可以访问umlchina.com/url/ap.html 已排版成适合手机阅读&#xff0c;pdf的排版更好一些。 ★UMLChina为什么叒要翻译《分析模式》&#xff1f; ★[缝合故…

科技资讯|谷歌Play应用商店有望支持 XR 头显,AR / VR设备有望得到发展

据 Android Authority 报道&#xff0c;谷歌似乎正在为其 Play 商店增加对 XR 头显的支持。该媒体在 Play 商店的代码中发现了相关的线索&#xff0c;包括一个代表头显的小图标以及对“XR 头显”的提及。 谷歌也可能改变了此前拒绝将 Play 商店引入 Meta Quest 头显的决定。今…

ES跟Kafka集成

配合流程 1. Kafka作为分布式流处理平台&#xff0c;能够实时收集和处理不同数据源的数据流&#xff1b; 2. 通过Kafka Connect或者Logstash等中间件&#xff0c;可以将Kafka中的数据流实时推送到Elasticsearch中&#xff1b; 3. Elasticsearch接收到数据后&#xff0c;会根据…

查缺补漏----关于计组两道题辨析

答案&#xff1a;A 指令字由操作码、寻址特征和地址码三个字段组成&#xff0c;寻址特征字段用来指明指令属于哪种寻址方式。若寻址方式是寄存器直接寻址&#xff0c;则地址码所指的通用寄存器中存放的是操作数&#xff0c;若寻址方式是寄存器间接寻址&#xff0c;则对应通用寄…

uniapp学习(010-2 实现抖音小程序上线)

零基础入门uniapp Vue3组合式API版本到咸虾米壁纸项目实战&#xff0c;开发打包微信小程序、抖音小程序、H5、安卓APP客户端等 总时长 23:40:00 共116P 此文章包含第113p的内容 文章目录 抖音小程序下载抖音开发者工具先去开发者工具里进行测试 抖音开放平台配置开始打包上传…

[Approaching any Machine Learning] Supervised vs unsupervised learning - Note

Page 11 single_image pixel_values[1, :].reshape(28, 28) plt.imshow(single_image, cmapgray)用这个代码运行是会出错的&#xff0c;应该改为以下代码&#xff1a; pixel_np pixel_values.iloc[1, :].values single_image pixel_np.reshape(28, 28) plt.imshow(single_…

buu easyRE

这道题目我想写的东西不是很多&#xff0c;前面的部分按常规流程走&#xff0c;第一步我们写逆脚本&#xff0c;推算出数组v15的值&#xff0c;但是输出值却没有啥用&#xff0c;只是告诉我们&#xff0c;the first parts are flag &#xff0c;没多大用&#xff0c;然后后…

qt QProgressBar详解

1、概述 QProgressBar是Qt框架中的一个控件&#xff0c;专门用于显示任务的进度。它提供了一个可视化的进度条&#xff0c;让用户能够直观地了解任务的完成程度。QProgressBar支持水平和垂直两种显示方向&#xff0c;并且可以通过设置最小值和最大值来指定进度条的范围。此外&…

Nginx 实现动态封禁IP,详细教程来了

Nginx 实现动态封禁IP&#xff0c;详细教程来了 需求环境准备设计方案在操作系统层面&#xff0c;配置 iptables&#xff0c;来拦截指定 IP 的网络请求在 Web 服务器层面&#xff0c;通过 Nginx 自身的 deny 选项或者 lua 插件配置 IP 黑名单在应用层面&#xff0c;在处理请求之…

C++入门——“C++11-右值引用和移动语义”

C11相比于C98增加以许多新特性&#xff0c;让C语言更加灵活好用&#xff0c;但是貌似也增加了许多学习的难度&#xff0c;现在先看第一部分。 一、右值引用和移动语义 1.右值引用和左值引用 在C中&#xff0c;值可以大致分为右值和左值&#xff0c;左值大概是哪些已经被定义的变…

Leetcode 64. 最小路径和 动态规划+空间优化

原题链接&#xff1a;Leetcode 64. 最小路径和 二维数据 class Solution { public:int minPathSum(vector<vector<int>>& grid) {int m grid.size();int n grid[0].size();int dp[m][n];dp[0][0] grid[0][0];for (int j 1; j < n; j)dp[0][j] dp[0][…

OpenHarmony、HarmonyOS、HarmonyNext互相兼容吗?

1&#xff0c;三者之间的关系 OpenHarmony&#xff1a;开源底层。HarmonyOS&#xff1a;闭源手机系统&#xff0c;兼容安卓生态。HarmonyOS NEXT&#xff1a;纯血鸿蒙&#xff0c;不兼容安卓。 上一篇文章简单介绍过&#xff0c;就不再多说了&#xff0c;这里说一下HarmonyOS …

定制化视频生成新模范!零样本主体驱动,精确运动控制!复旦阿里等发布DreamVideo-2

文章链接&#xff1a;https://arxiv.org/pdf/2410.13830 项目链接&#xff1a;https://dreamvideo2.github.io/ 亮点直击 DreamVideo-2&#xff0c;首个无需微调&#xff0c;同时支持主体定制和运动控制的零样本视频定制框架&#xff0c;能够通过设计的参考注意力学习主体外观&…

Java中的线程安全问题(如果想知道Java中有关线程安全问题的基本知识,那么只看这一篇就足够了!)

前言&#xff1a;多线程编程已经广泛开始使用&#xff0c;其可以充分利用系统资源来提升效率&#xff0c;但是线程安全问题也随之出现&#xff0c;它直接影响了程序的正确性和稳定性&#xff0c;需要对其进行深入的理解与解决。 ✨✨✨这里是秋刀鱼不做梦的BLOG ✨✨✨想要了解…

Kubernetes Node 节点的生命周期简述

Node 节点是 Kubernetes 的核心组件之一&#xff0c;其生命周期可以简要概括为&#xff1a;注册、运行、下线。本文将简要介绍 Node 生命周期中发生的关键事件。 节点注册 每个 node 节点都需要运行 kubelet&#xff0c;kubelet 启动后会向 kube-apiserver 发起节点的注册请求…