[栈思想]后缀表达式

后缀表达式

题目描述

后缀表达式是指这样的一个表达式:式中不使用括号,运算符号放在两个运算数之后,所有计算按运算符号出现的顺序,严格地自左而右进行(不用考虑运算符的优先级)
如: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.mzph.cn/news/177217.shtml

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

相关文章

C#实体类与XML互转以及List和DataTable转XML的使用

引言 在C#开发中&#xff0c;数据的存储和传输是非常常见的需求。使用XML作为数据格式有很多优点&#xff0c;例如可读性强、易于解析等。而实体类、List和DataTable是表示数据模型的常用方式。本文将介绍如何在C#中实现实体类、List和DataTable与XML之间的相互转换&#xff0c…

Mac_mac常用快捷键

锁屏 锁屏 controlcommandq 截图与录屏」 command shift 3&#xff1a;截图整个屏幕command shift 4&#xff1a;截图所选区域command shift 5&#xff1a;录制屏幕 区域可选 「浏览器快捷键」 command T&#xff1a;打开新标签页command W&#xff1a;关闭当前标签…

【数据结构—单链表的实现】

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 前言 1. 链表的概念及结构 2. 单链表的实现 2.1单链表头文件——功能函数的定义 2.2单链表源文件——功能函数的实现 2.3 单链表源文件——功能的测试 3.具体的理解操作…

二叉树OJ题讲解之一

今天我们一起来做一道初级的二叉树OJ题&#xff0c;都是用递归思想解答 力扣965.单值二叉树 链接https://leetcode.cn/problems/univalued-binary-tree/description/ 所谓单值二叉树就是这棵二叉树的所有节点的值是相同的&#xff0c;那我们要做这道题&#xff0c;肯定要…

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

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

部署jenkins一直显示Please wait while Jenkins is getting ready to work

部署jenkins一直显示Please wait while Jenkins is getting ready to work … 需要你进入jenkins的工作目录 vim .jenkins/hudson.model.UpdateCenter.xml将https://updates.jenkins.io/update-center.json更换为更改为https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates…

Python基础:推导式(Comprehensions)详解

1. 推导式概念 Python推导式&#xff08;comprehensions&#xff09;是一种简洁而强大的语法&#xff0c;用于从已存在的数据&#xff08;列表、元组、集合、字典等&#xff09;中创建新的数据结构。推导式包括&#xff1a; 列表推导式元组推导式字典推导式集合推导式 2. 列表…

Vue 实现低代码开发平台,没想到这么好用!

前言 在众多开发技术中&#xff0c;Vue 组件化开发技术以其卓越的灵活性和高效性备受瞩目。 低代码平台相信不少人知道它的存在&#xff0c;而且现在大部分公司都在开发自己的低代码平台&#xff0c;首先我们来看看低代码平台可视化界面&#xff1a; 官网&#xff1a;https:/…

跨标签页通信的8种方式(下)

跨标签页通信是指在浏览器中的不同标签页之间进行数据传递和通信的过程。在传统的Web开发中&#xff0c;每个标签页都是相互独立的&#xff0c;无法直接共享数据。然而&#xff0c;有时候我们需要在不同的标签页之间进行数据共享或者实现一些协同操作&#xff0c;这就需要使用跨…

1233:单词倒置(C语言)

题目描述 最近birdfly收到了女友的几份信件&#xff0c;为了只要他俩知道信件的秘密&#xff0c;女友把信件里的每个单词都倒置了。这样只有birdfly将它们倒置过来才能明白女友的心思了。为此birdfly还特意请你编写程序帮他解决一下这个问题。 简单起见假定每封信只包含英文单词…

DDD全网最通俗易懂讲解(一)

基础概念 领域 领域就是用来确定范围的&#xff0c;范围即边界&#xff0c;这也是DDD在设计中不断强调边界的原因。简言之&#xff0c;DDD的领域就是这个边界内要解决的业务问题域。领域可以进一步划分为子领域。一个领域相当于一个问题域&#xff0c;领域拆分为子域的过程就…

阶段二:进阶知识(掌握Python的常用设计模式)

Python中常用的设计模式包括工厂方法模式。 工厂方法模式是一种创建型模式&#xff0c;它提供了一种创建对象的接口&#xff0c;但具体创建的对象类型可以在运行时决定。这种模式使得创建对象的行为延迟到其子类中&#xff0c;使得代码更加灵活、可扩展和维护性更高。 在Pyth…

GCM的Counter模式加密与解密java实现

GCM即Galois/Counter Mode&#xff0c;指的是加密采用Counter模式&#xff0c;并且带有GMAC消息认证码 import lombok.extern.slf4j.Slf4j;import javax.crypto.Cipher; import javax.crypto.KeyGenerator; import javax.crypto.SecretKey; import javax.crypto.spec.GCMParam…

详解二叉树

【本节目标】 1.树的概念和结构 2.二叉树的概念和结构 3.二叉树的顺序结构及实现 4.二叉树的链式结构及实现 1.树的概念及结构 1.1树的概念 树是一种非线性的数据结构&#xff0c;它由一个根结点和n(>0)个子树构成&#xff0c;之所以叫做树&#xff0c;是因为它很像生活…

ArkTS开发webview,html页面中的input和按钮等操作均无响应 【Bug已解决-鸿蒙开发】

文章目录 项目场景:问题描述原因分析:解决方案(根据此方法即可解决此Bug):本文相关知识本Bug常规排除步骤ArkTS项目场景: 在鸿蒙开发过程遇到的问题: 问题 ArkTS API9 使用webview加载的html,页面中的按钮和input等操作均无响应 是有相关API设置webview是否可以touch或…

Hive数据库与表操作

文章目录 一、准备工作二、Hive数据库操作&#xff08;一&#xff09;Hive数据存储&#xff08;二&#xff09;创建数据库&#xff08;三&#xff09;查看数据库&#xff08;四&#xff09;修改数据库信息 一、准备工作 二、Hive数据库操作 &#xff08;一&#xff09;Hive数据…

Python Selenium 图片资源自动搜索保存 项目实践

实现访问首页 from os.path import dirnamefrom selenium import webdriverclass ImageAutoSearchAndSave:"""图片自动搜索保存"""def __init__(self):"""初始化"""self.driver webdriver.Chrome(executable_pa…

Jsch 使用过程中遇到的问题及解决方法

Jsch 使用过程中遇到的问题及解决方法 使用版本 //maven <dependency><groupId>com.jcraft</groupId><artifactId>jsch</artifactId><version>0.1.55</version> </dependency>//gradle implementation com.jcraft:jsch:0.1.…

西南科技大学数字电子技术实验二(SSI逻辑器件设计组合逻辑电路及FPGA实现 )FPGA部分

一、实验目的 1、掌握用SSI(小规模集成电路)逻辑器件设计组合电路的方法。 2、掌握组合逻辑电路的调试方法。 3、学会分析和解决实验中遇到的问题。 4、学会用FPGA实现本实验内容。 二、实验原理 包括:原理图绘制和实验原理简述 1、1位半加器 2、1位全加器 3、三…

数据结构 / day03作业

1.顺序表按元素删除 //main.c#include "head.h" int main(int argc, const char *argv[]) {sqlist *listcreate_space();// printf("&list%p\n", list);int n;int index;data_type element, key;printf("please input n;");scanf("%d&…