[栈思想]后缀表达式

后缀表达式

题目描述

后缀表达式是指这样的一个表达式:式中不使用括号,运算符号放在两个运算数之后,所有计算按运算符号出现的顺序,严格地自左而右进行(不用考虑运算符的优先级)
如:3*(5-2)+7对应的后缀表达式为:3 5 2 - * 7 + @。’@’为表达式的结束符号。
(注:运算过程中请使用long long进行运算。)

关于输入

多行,每行一个用空格分割的后缀表达式。保证表达式长度不超过1000个字符。
表达式中可能出现整数,+ - * /四种运算符,以及@。

关于输出

输出多行,为对应表达式的值。
如果在运算过程中出现除0,那么输出NaN。

例子输入

3 5 2 - * 7 + @

例子输出

16

解题分析

这个问题中,我们需要计算后缀表达式的值。后缀表达式是一种没有括号,运算符放在两个操作数之后的表达式,所有计算按照运算符出现的顺序,严格地从左到右进行。

解决这个问题的关键在于理解后缀表达式的计算方式,以及如何利用栈数据结构来进行计算。

我们使用一个栈来存储数字,然后遍历输入的字符串。如果遇到的是数字,我们就把它压入栈中。如果遇到的是运算符,我们就从栈顶弹出两个元素,进行相应的运算,然后把结果再压回栈中。这样,当我们遍历完整个字符串后,栈顶的元素就是整个表达式的计算结果。

可以用一个数组stack来模拟栈,top变量用来表示栈顶的位置。push函数用来把一个元素压入栈,pop函数用来弹出栈顶的元素。

在main函数中,我们首先读入一行输入,然后遍历这个字符串。如果遇到的是数字,我们就把它转换成整数,并压入栈中。如果遇到的是运算符,我们就弹出栈顶的两个元素,进行相应的运算,然后把结果压回栈中。如果遇到的是’@',我们就直接输出栈顶的元素,然后清空栈。

在处理除法时,我们需要注意除数不能为0。如果除数为0,我们就直接输出"NaN",然后跳出循环。

这个算法的时间复杂度为O(n),其中n为输入字符串的长度,空间复杂度为O(n),其中n为输入字符串中数字的个数。

代码实现

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

long long stack[1005];
int top=-1;

void push(long long a){
    stack[++top]=a;
}

long long pop(){
    return stack[top--];
}

int main(){
    char input[1005];
    long long a,b;
    while(fgets(input,1005,stdin)){
        int i=0;
        while(i<strlen(input)){
            if(input[i]>='0' && input[i]<='9'){
                long long num=0;
                while(i<strlen(input) && input[i]>='0' && input[i]<='9'){
                    num*=10;
                    num+=input[i]-'0';
                    i++;
                }
                push(num);
            }
            else if(input[i]=='+'){
                a=pop(); b=pop();
                push(b+a);
                i++;
            }
            else if(input[i]=='-'){
                a=pop(); b=pop();
                push(b-a);
                i++;
            }
            else if(input[i]=='*'){
                a=pop(); b=pop();
                push(b*a);
                i++;
            }
            else if(input[i]=='/'){
                a=pop(); b=pop();
                if(a==0){
                    printf("NaN\n");
                    break;
                }
                push(b/a);
                i++;
            }
            else if(input[i]=='@'){
                printf("%lld\n",pop());
                top=-1;
                break;
            }
            else{
            i++;
            }
        }
    }
    return 0;
}

代码详细解释

当然可以,让我们更详细地分析这段代码:

首先,我们定义了一个全局的栈stack和一个栈顶指针top。这个栈用来存储后缀表达式中的数字,栈顶指针用来表示当前栈顶的位置。

long long stack[1005];
int top=-1;

接下来,我们定义了两个操作栈的函数:pushpoppush函数用来将一个元素压入栈,pop函数用来弹出栈顶的元素。

void push(long long a){
    stack[++top]=a;
}

long long pop(){
    return stack[top--];
}

main函数中,我们首先读入一行输入,然后开始遍历这个字符串。

char input[1005];
long long a,b;
while(fgets(input,1005,stdin)){
    int i=0;
    while(i<strlen(input)){

如果遇到的是数字,我们就把它转换成整数,并压入栈中。

if(input[i]>='0' && input[i]<='9'){
    long long num=0;
    while(i<strlen(input) && input[i]>='0' && input[i]<='9'){
        num*=10;
        num+=input[i]-'0';
        i++;
    }
    push(num);
}

如果遇到的是运算符,我们就弹出栈顶的两个元素,进行相应的运算,然后把结果压回栈中。

else if(input[i]=='+'){
    a=pop(); b=pop();
    push(b+a);
    i++;
}
else if(input[i]=='-'){
    a=pop(); b=pop();
    push(b-a);
    i++;
}
else if(input[i]=='*'){
    a=pop(); b=pop();
    push(b*a);
    i++;
}
else if(input[i]=='/'){
    a=pop(); b=pop();
    if(a==0){
        printf("NaN\n");
        break;
    }
    push(b/a);
    i++;
}

如果遇到的是’@',我们就直接输出栈顶的元素,然后清空栈。

else if(input[i]=='@'){
    printf("%lld\n",pop());
    top=-1;
    break;
}

对于其他字符,我们直接忽略。

else{
    i++;
}

最后,当我们遍历完整个字符串后,我们就可以得到后缀表达式的计算结果。

这个算法的时间复杂度为O(n),其中n为输入字符串的长度,空间复杂度为O(n),其中n为输入字符串中数字的个数。

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

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

相关文章

2019年11月7日 Go生态洞察:Go Modules v2及更高版本

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

应用密码学期末复习(1)

学习资料 应用密码学总结_应用密码学知识点总结-CSDN博客 应用密码学期末复习知识点总结_5的36次方mod97__PriDe的博客-CSDN博客 【密码学】密码学期末考试速成课&#xff0c;不挂科&#xff01;&#xff01;#高数帮_哔哩哔哩_bilibili 目录 学习资料 第一章 概述 1.1信息…

淼一科技为互联网企业销毁硬盘数据 拆除机房设备

在上海这座繁华的大都市&#xff0c;淼一科技以其专业的服务和卓越的技术&#xff0c;为众多互联网企业提供硬盘数据销毁和机房设备拆除服务。作为业界领先的数据安全解决方案提供商&#xff0c;淼一科技致力于保障客户数据的安全与隐私&#xff0c;为客户创造更高的商业价值。…

uniapp前端+python后端=微信小程序支付到底怎么开发???国内的资料为什么没一篇能讲清楚,简简单单的只需要3步就可以了-V2版本

一.微信小程序支付 真的&#xff0c;在接到这个任务的时候&#xff0c;本以为很简单&#xff0c;不就是普通的浏览器复制粘贴&#xff0c;最不济找下gpt给生成一下&#xff0c;但是到实际开发就不同了&#xff0c;不是后端出问题就是前端&#xff0c;搜资料&#xff0c;上百度…

Current request is not a multipart request问题排查

概述 在应用工程里看到如下被标记为deprecated的代码&#xff0c;这对有代码洁癖的我而言是无法忍受的&#xff1a; row.getCell(10).setCellType(Cell.CELL_TYPE_STRING); String hospital row.getCell(0).getStringCellValue();对应的poi版本号&#xff1f;是的&#xff…

适用于iOS 的顶级苹果数据恢复软件

数据丢失可能随时发生在任何人身上&#xff0c;这可能是一种令人沮丧的经历。丢失 iOS 设备上的重要数据可能会造成特别严重的损失&#xff0c;因为其中可能包括有价值的照片、联系人、消息和其他重要文件。幸运的是&#xff0c;有多种数据恢复工具可以帮助用户恢复丢失的数据。…

filebeat日志收集工具

elk:filebeat日志收集工具和logstash相同 filebeat是一个轻量级的日志收集工具&#xff0c;所使用的系统资源比logstash部署和启动时使用的资源要小得多 filebeat可以运行在非Java环境&#xff0c;它可以代理logstash在非Java环境上收集日志 filebeat无法实现数据的过滤&…

定制开发办公软件在企业发展中的优势|app小程序网站搭建

定制开发办公软件在企业发展中的优势|app小程序网站搭建 如今&#xff0c;办公软件已经成为企业日常工作的必需品。很多企业为了提高工作效率和满足自身业务需要&#xff0c;选择定制开发办公软件。下面将介绍定制开发办公软件在企业发展中的优势。 首先&#xff0c;定制开发办…

DjiTello + YoloV5的无人机的抽烟检测

一、效果展示 注&#xff1a;此项目纯作者自己原创&#xff0c;创作不易&#xff0c;不经同意不给予搬运权限&#xff0c;转发前请联系我&#xff0c;源码较大需要者评论获取&#xff0c;谢谢配合&#xff01; 1、未启动飞行模型无人机的目标检测。 DjiTello YOLOV5抽烟检测 …

EDA实验-----正弦信号发生器的设计(Quartus II )

目录 一、实验目的 二、实验仪器 三、实验原理 四、实验内容 五、实验步骤 六、注意事项 七、实验过程&#xff08;操作过程&#xff09; 1.定制LPM_ROM模块 2.定制LPM_ROM元件 3.计数器定制 4.创建锁相环 5.作出电路图 6.顶层设计仿真 一、实验目的 学习使用Ver…

Echarts地图registerMap使用的GeoJson数据获取

https://datav.aliyun.com/portal/school/atlas/area_selector 可以选择省&#xff0c;市&#xff0c;区。 也可以直接在地图上点击对应区域。 我的应用场景 我这里用到这个还是一个特别老的大屏项目&#xff0c;用的jq写的。显示中国地图边界区域 我们在上面的这个地区选择…

【开源】基于Vue+SpringBoot的独居老人物资配送系统

项目编号&#xff1a; S 045 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S045&#xff0c;文末获取源码。} 项目编号&#xff1a;S045&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块三、系统展示四、核心代码4.1 查询社区4…

ELK---filebeat日志收集工具

filebeat日志收集工具 filebeat日志收集工具和logstash相同 filebeat的优点&#xff1a; filebeat是一个轻量级的日志收集工具&#xff0c;所使用的系统资源比logstash部署和启动时使用的资源要小的多 filebeat可以运行在非Java环境。它可以代替logstash在非Java环境上收集…

Java学习路线第一篇:Java基础(2)

这篇则分享Java学习路线第一part&#xff1a;Java基础&#xff08;2&#xff09; 从看到这篇内容开始&#xff0c;你就是被选定的天命骚年&#xff0c;将承担起学完Java基础的使命&#xff0c;本使命为单向契约&#xff0c;你可选择YES或者选择YES。 具体路线安排&#xff1a…

深度学习第1天:深度学习入门-Keras与典型神经网络结构

☁️主页 Nowl &#x1f525;专栏《机器学习实战》 《机器学习》 &#x1f4d1;君子坐而论道&#xff0c;少年起而行之 文章目录 神经网络 介绍 结构 基本要素 Keras 介绍 导入 定义网络 模型训练 前馈神经网络 特点 常见类型 代码示例 反馈神经网络 特点 …

AlphaFold的原理及解读

1、背景 蛋白质是生物体内一类重要的生物大分子&#xff0c;其结构复杂多样&#xff0c;蛋白质的结构对于理解其功能和参与的生物学过程具有重要意义。从生物学角度上看&#xff0c;蛋白质的结构可以分为四个层次&#xff1a;初级结构、二级结构、三级结构和四级结构。 初级结…

企业如何保障跨境金融业务中的数据安全传输?

随着全球化的不断深入&#xff0c;跨境金融业务日益频繁&#xff0c;然而在这些业务中&#xff0c;数据的安全传输一直是企业面临的重大挑战。跨境业务数据传输可能会遇到多种困难&#xff0c;如网络攻击、数据泄露、通信故障等。因此&#xff0c;企业需要采取有效的措施来确保…

【Mybatis系列】Mybatis之TypeHandler入门

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

【C语言】深入理解数据类型转换与运算

文章目录 1.数据类型转换在分析源程序之前&#xff0c;我们需要了解几个基本概念&#xff1a;现在来分析源程序中的变量及其对应的十进制真值以及扩展操作方式&#xff1a; 1.1. short si -32768;1.2. unsigned short usi si;1.3. int i si;1.4. unsigned ui usi; 2&#x…

U-Net及其变体在医学图像分割中的应用研究综述

U-Net及其变体在医学图像分割中的应用研究综述 论文来自&#xff1a;中国生物医学工程学报 2022 摘 要&#xff1a; 医学图像分割可以为临床诊疗和病理学研究提供可靠的依据&#xff0c;并能辅助医生对病人的病情做出准确的判断。 基于深度学习的分割网络的出现解决了传统自动分…
最新文章