22. 仿LISP运算

题目描述

LISP语言唯一的语法就是括号要配对

形如(OP P1 P2 ...),括号内元素由单个空格分割。其中第一个元素OP为操作符,后续元素均为其参数,参数个数取决于操作符类型。注意:参数P1,P2也有可能是另外一个嵌套的(OP P1 P2...),当前OP类型为add/sub/mul/div(全小写) 分别代表整数的加减乘除法,简单起见,所有OP参数个数均为2。

举例:

输入:(mul 3 -7)输出:-21

输入:(add 1 2)输出:3

输入:(sub (mul 2 4) (div 9 3))输出:5

输入:(div 1 0)输出:error

题目涉及数字均为整数,可能为负:不考虑32位溢出翻转,计算过程中也不会发生32位溢出翻转。除零错误时,输出“error”,除法遇除不尽,向下取整,即3/2=1

输入描述

输入为长度不超过512的字符串,用例保证了无语法错误

输出描述

输出计算结果或者“error”

用例

一、问题分析

首先读题,仔细看描述中的内容,发现需求是

1.LISP语言唯一的语法就是括号要配对,形如(OP P1 P2...)括号内的元素由单个空格分割。其中第一个元素OP为操作符,后续元素均为其参数,参数个数取决于操作符类型(简单起见这里所有OP的参数均为2),注意:参数P1,P2也有可能是另外一个嵌套的(OP P1 P2...),当前OP类型为add/sub/mul/div(全小写)分别代表加减乘除法。

2.题目涉及数字均为整数,可能为负;不考虑32位溢出翻转,计算过程中也不会发生32位溢出翻转。除零错误时,输出“error”,除法遇除不尽,向下取整,即3 / 2 = 1;

3.输入描述:输入长度不超过512的字符串,用例保证了无语法错误

4.输出描述:输出计算结果或者“error”

二、解题思路

1.我们建立两个数组一个用于存储我们的运算符号一个用于存储我们的数字

2.每当遇到左括号的时候我们将括号右边的运算符和数字分别压倒栈中

3.如果第一个数字之后不是左括号而是数字,我们根据栈中的符号对栈顶的数字进行运算,(弹出运算符)

4.如果遇到右括号我们查看运算符的数组中是否还有剩余的运算符,如果有那么我们

5.弹出栈顶元素并和当前栈顶位置的元素做运算(弹出运算符)并且索引值减小1

三、具体步骤

使用的语言是C

#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include <stdbool.h>
int main() {
    char str[512];
    fgets(str, sizeof(str), stdin);
    str[strcspn(str, "\n")] = '\0';
    int len = strlen(str);
    int operator[512];
    int nums[512];
    int oi = 0;
    int ni = 0;
    for(int i = 0; i < len; i++) {
        if(str[i] == '(') {
            if(str[i + 1] == 'a' && str[i + 2] == 'd' && str[i + 3] == 'd' && str[i + 4] == ' ') {
                operator[oi++] = 0;
            } else if(str[i + 1] == 's' && str[i + 2] == 'u' && str[i + 3] == 'b' && str[i + 4] == ' ') {
                operator[oi++] = 1;
            } else if(str[i + 1] == 'm' && str[i + 2] == 'u' && str[i + 3] == 'l' && str[i + 4] == ' ') {
                operator[oi++] = 2;
            } else if(str[i + 1] == 'd' && str[i + 2] == 'i' && str[i + 3] == 'v' && str[i + 4] == ' ') {
                operator[oi++] = 3;
            } else {
                printf("error\n");
                return 0;
            }
            i += 4;
        }
        bool n = false;
        if(str[i] == '-') {
            n = true;
            i++;
        }
        if(isdigit(str[i])) {
            int tempnum = str[i] - '0';
            i++;
            while(i < len && isdigit(str[i])) {
                tempnum = tempnum * 10 + str[i] - '0';
                i++;
            }
            if(n) tempnum = tempnum * (-1);
            nums[ni++] = tempnum; 
        }
        if(str[i] == ')') {
            oi--;
            ni--;
            switch (operator[oi]) {
                case 0:
                    nums[ni - 1] += nums[ni];
                    break;
                case 1:
                    nums[ni - 1] -= nums[ni];
                    break;
                case 2:
                    nums[ni - 1] *= nums[ni];
                    break;
                case 3:
                    if(nums[ni] == 0) {
                        printf("error\n");
                        return 0;
                    } else {
                        nums[ni - 1] /= nums[ni];
                        break;
                    }
            }
        }
    }
    printf("%d", nums[0]);
    return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Axure10

如果还是不行就将字体图标安装在控制面板–字体下 打开原型了之后&#xff0c;icon没有 一定要将字体库放到–》控制面板\外观和个性化\字体 里面

王佩丰24节Excel学习笔记——第十九讲:Indirect函数

【以 Excel2010 系列学习&#xff0c;用 Office LTSC 专业增强版 2021 实践】 【本章技巧】 如果indirect引用出错&#xff0c;首先检查一下引用位置的双引号有没有出错&#xff0c;再检查引用值的位置是否出错&#xff0c;如果是双引号出错&#xff0c;可以使用英文状态下输入…

基于 Ragflow 搭建知识库-初步实践

基于 Ragflow 搭建知识库-初步实践 一、简介 Ragflow 是一个强大的工具&#xff0c;可用于构建知识库&#xff0c;实现高效的知识检索和查询功能。本文介绍如何利用 Ragflow 搭建知识库&#xff0c;包括环境准备、安装步骤、配置过程以及基本使用方法。 二、环境准备 硬件要…

Structured-Streaming初识

一、概览 Structured Streaming是一个基于SparkSQL引擎构建的可扩展且容错的流处理引擎。可以像在静态数据上表达批量计算一样表达流计算。SparkSQL引擎将负责以增量方式连续运行它&#xff0c;并在流数据继续到达时更新最终结果。可以使用Scala、Java、Python或R中的Dataset/…

Gradio全解系列——Additional Features:附加功能(上)

Gradio全解系列——Additional Features&#xff1a;附加功能&#xff08;上&#xff09; 前言本篇摘要10. Additional Features&#xff1a;附加功能10.1 队列10.1.1 使用方法10.1.2 配置队列 10.2 流输入输出10.2.1 流输出1. 生成器yield2. 流媒体 10.2.2 流输入1. 流事件2. …

TestMAX/DFT Compiler:时序单元的类型、连接顺序和后DFT优化

相关阅读 TestMAX/DFT Compilerhttps://blog.csdn.net/weixin_45791458/category_12865937.html?spm1001.2014.3001.5482 时序单元的状态 未映射的时序单元(Unmapped Sequential Cell) 在Design Compiler读取了一个RTL设计后&#xff0c;Design Compiler内置的HDL Compiler工…

Cocos Creator 3.8.5 正式发布,更小更快更多平台!

在 Cocos Creator 3.8.5 版本中&#xff0c;我们做了新一轮的优化。 在加载速度、代码裁剪、平台增强等多方面做了优化&#xff0c;提升了开发者体验和游戏性能。 希望能够助 Cocos 开发者们的产品更上一层楼。 一、加载速度优化 1、WASM 模块延迟加载 在早期版本中&#xff0c…

跨语言数据格式标准化在 HarmonyOS 开发中的实践

文章目录 前言数据格式标准化的意义数据传递中的痛点标准化的优势 JSON 与 Protocol Buffers 的比较JSONProtocol Buffers HarmonyOS 跨语言数据传递示例示例代码&#xff1a;定义 Protocol Buffers 消息格式生成 Java 和 C 代码示例代码&#xff1a;Java 端序列化与传递数据C …

【有作图代码】多尺度动力学模型:像“显微镜与望远镜的结合”,揭示微观分子运动与宏观流体流动的奥秘

【有作图代码】多尺度动力学模型&#xff1a;像“显微镜与望远镜的结合”&#xff0c;揭示微观分子运动与宏观流体流动的奥秘 具体实例与推演 假设我们有一个流体系统&#xff0c;其中微观尺度上分子间的相互作用可以通过分子动力学方程描述&#xff0c;而宏观尺度上流体的流…

工具变量笔记

补充知识 简单介绍工具变量 假设 Y i α β D i ϵ i Y_i\alpha\beta D_i\epsilon_i Yi​αβDi​ϵi​, where E ( ϵ i ∣ D i ) 0 E(\epsilon_i\mid D_i)0 E(ϵi​∣Di​)0. 但是通常这个条件不满足。于是假如有这样一个工具变量 Z i Z_i Zi​存在的话&#xff0c;满…

通过 Ansys Electronics Desktop 中的高级仿真优化 IC 设计

半导体行业继续通过日益复杂的集成电路 (IC) 设计突破技术界限。随着工艺节点缩小和电路密度达到前所未有的水平&#xff0c;电磁效应对设备性能和可靠性变得越来越重要。现代 IC 设计面临着来自复杂的布局相关耦合机制、信号完整性问题和功率分布问题的挑战&#xff0c;这些问…

Yocto 项目中的交叉编译:原理与实例

Yocto 项目是一个强大的工具集&#xff0c;它专注于为嵌入式系统生成定制的 Linux 发行版。交叉编译在 Yocto 项目中扮演着核心角色&#xff0c;它使得开发者能够在功能强大的宿主机上构建适用于资源受限目标设备的软件系统。这篇文章将从运行原理、实际案例和工具链组成等角度…

WPF 绘制过顶点的圆滑曲线(样条,贝塞尔)

项目中要用到样条曲线&#xff0c;必须过顶点&#xff0c;圆滑后还不能太走样&#xff0c;捣鼓一番&#xff0c;发现里面颇有玄机&#xff0c;于是把我多方抄来改造的方法发出来&#xff0c;方便新手&#xff1a; 如上图&#xff0c;看代码吧&#xff1a; -------------------…

谷粒商城-高级篇-秒杀业务

1、后台添加秒杀商品 1、配置网关 - id: coupon_routeuri: lb://gulimall-couponpredicates:- Path/api/coupon/**filters:- RewritePath/api/(?<segment>.*),/$\{segment} 2、每日秒杀关联商品功能实现 点击关联商品后&#xff0c;应该查询当前场次的所有商品 点击关…

JuOne核心模块揭秘:从智能硬件到Web3生态的完美连接

JuOne核心模块揭秘&#xff1a;从智能硬件到Web3生态的完美连接在全球数字经济的浪潮中&#xff0c;Web3 正以前所未有的速度重塑我们的生活方式、商业模式和价值创造体系。它不仅仅是互联网的下一阶段&#xff0c;更是一场关于未来的革命。去中心化、用户主权、价值互联&#…

Kafka高性能设计

高性能设计概述 Kafka高性能是多方面协同的结果&#xff0c;包括集群架构、分布式存储、ISR数据同步及高效利用磁盘和操作系统特性等。主要体现在消息分区、顺序读写、页缓存、零拷贝、消息压缩和分批发送六个方面。 消息分区 存储不受单台服务器限制&#xff0c;能处理更多数据…

若依框架之简历pdf文档预览功能

一、前端 &#xff08;1&#xff09;安装插件vue-pdf&#xff1a;npm install vue-pdf &#xff08;2&#xff09;引入方式&#xff1a;import pdf from "vue-pdf"; &#xff08;3&#xff09;components注入方式&#xff1a;components:{pdf} &#xff08;4&…

【社区投稿】自动特征auto trait的扩散规则

自动特征auto trait的扩散规则 公式化地概括&#xff0c;auto trait marker trait derived trait。其中&#xff0c;等号右侧的marker与derived是在Rustonomicon书中的引入的概念&#xff0c;鲜见于Rust References。所以&#xff0c;若略感生僻&#xff0c;不奇怪。 marker …

Elasticsearch检索之三:官方推荐方案search_after检索实现(golang)

Elasticsearch8.17.0在mac上的安装 Kibana8.17.0在mac上的安装 Elasticsearch检索方案之一&#xff1a;使用fromsize实现分页 快速掌握Elasticsearch检索之二&#xff1a;滚动查询(scrool)获取全量数据(golang) 1、search_after检索 在前面的文章介绍了fromsize的普通分页…

精读DeepSeek v3技术文档的心得感悟

最近宋大宝同学读完了DeepSeekv3的文档&#xff0c;心中颇多感慨&#xff0c;忍不住想在这里记录一下对这款“业界有望启示未来低精度训练走向”的开源大模型的观察与思考。DeepSeek v3的亮点绝不仅仅是“Float8”或“超长上下文”这么简单&#xff0c;而是贯穿了从数值精度、注…