后缀表达式求值

题目要求:

后缀表达式求值:建立一个操作数栈S。然后从左到右读表达式,如果读到操作数就将它压入栈S中,如果读到n元运算符(即需要参数个数为n的运算符)则取出由栈顶向下的n项操作数进行运算,再将运算的结果代替原栈顶的n项压入栈中。重复上面过程,如果后缀表达式读完且栈中只剩一个操作数,则该数就是运算结果;如果后缀表达式读完但是栈中操作数多于一个,则后缀表达式错误;如果栈中操作数只剩一个,但是后缀表达式还未读完且当前运算符为双元操作符,则后缀表达式同样错误。
输入格式:
在一行中输入一个以#号结束的非空后缀式,#不属于表达式的一部分,操作数和运算符都以空格分隔,运算数为绝对值不超过100的整数,运算符仅有+、-、*、/ 四种。
输出格式:
输出后缀式计算结果,所有的计算都只取结果的整数部分。题目保证计算的中间和最后结果的绝对值都不超过109。如果执行除法时出现分母为零的非法操作,则在一行中输出:Error: X/0,X是当时的分子。如果后缀表达式中运算符多了或者少了,则在一行中输出:Expression Error: X,X是当时栈顶元素。
输入样例1:5 -2 + 3 * #  输出:9
输入样例2:5 -2 2 + / #   输出:Error: 5/0
输入样例3:5 -1 3 + / - * #   输出Expression Error: 2

框架结构:

//用于存放操作数的栈
int OPND[100];
int top=0;
//运算操作
int operate(int a,char operate,int b)
//计算表达式函数,如果出现错误的表达式返回false,表达式正确返回true,并且表达式的值最终会存在栈里。
bool caculate(string s);
int main()
{string s;top=0;getline(cin,s);//可以接受空格 if(caculate(s)){cout<<"表达式的值为:"<<OPND[0];                                                 }
}

栈的一些操作:

其实不用特意的写这些函数,下面几个操作都可以用一个语句完成,写成函数是为了方便阅读

//栈的操作
void push(int num)
{OPND[top++]=num;
}
int pop()
{return OPND[--top];
}
int GetTop()
{return OPND[top-1];
}

将两个数进行一次操作的函数:

int operate(int a,char operate,int b)
{//不出现/0的情况 int ans;if(operate=='+')ans=a+b;else if(operate=='-')ans=a-b;else if(operate=='*')ans=a*b;elseans=a/b;return ans;
}

计算表达式的函数:

我是一个字符一个字符扫描的,有的人习惯将表达式的string串以空格分成多个string串,对每个string串扫描,这样也可以。

bool caculate(string s)
{int a,b,num=0,i=0;int sign=1;//记录数字符号 char thea;while(s[i]!='#'){if(s[i]>='0'&&s[i]<='9'){//遇到数字开始构造 num=10*num+s[i]-'0';}if(s[i]=='-'&&s[i+1]>='0'&&s[i+1]<='9'){//'-'后面跟着数字,说明遇到了负数 ,标记符号 sign=-1;}else if(s[i]=='+'||s[i]=='-'||s[i]=='/'||s[i]=='*'){if(top==0){//没有操作数 cout<<"Expression Error: No operand!";return false;}else if(top<2){//操作数不够 cout<<"Expression Error: "<<OPND[top-1];return false; }b=pop();a=pop();if(b==0&&s[i]=='/'){//除数为零的情况 cout<<"Expression Error: "<<a<<"/"<<b;return false;}int ans=operate(a,s[i],b);//先抛出的做第二操作数push(ans); }else if(s[i-1]>='0'&&s[i-1]<='9'&&s[i]==' '){//当前字符是空格并且前面字符是数字 num*=sign;push(num);num=0;sign=1;}i++;}if(top>1){//扫描结束后栈里的数大于一个,说明表达式有误cout<<"Expression Error: "<<OPND[top-1];return false;}return true;
}

代码:

#include<iostream>
using namespace std;
int OPND[100];
int top=0;
//栈的操作
void push(int num)
{OPND[top++]=num;
}
int pop()
{return OPND[--top];
}
int GetTop()
{return OPND[top-1];
}
int operate(int a,char operate,int b)
{//不出现/0的情况 int ans;if(operate=='+')ans=a+b;else if(operate=='-')ans=a-b;else if(operate=='*')ans=a*b;elseans=a/b;return ans;
}
bool caculate(string s)
{int a,b,num=0,i=0;int sign=1;//记录数字符号 char thea;while(s[i]!='#'){if(s[i]>='0'&&s[i]<='9'){//遇到数字开始构造 num=10*num+s[i]-'0';}if(s[i]=='-'&&s[i+1]>='0'&&s[i+1]<='9'){//'-'后面跟着数字,说明遇到了负数 ,标记符号 sign=-1;}else if(s[i]=='+'||s[i]=='-'||s[i]=='/'||s[i]=='*'){if(top==0){//没有操作数 cout<<"Expression Error: No operand!";return false;}else if(top<2){//操作数不够 cout<<"Expression Error: "<<OPND[top-1];return false; }b=pop();a=pop();if(b==0&&s[i]=='/'){//除数为零的情况 cout<<"Expression Error: "<<a<<"/"<<b;return false;}int ans=operate(a,s[i],b);//先抛出的做第二操作数push(ans); }else if(s[i-1]>='0'&&s[i-1]<='9'&&s[i]==' '){//当前字符是空格并且前面字符是数字 num*=sign;push(num);num=0;sign=1;}i++;}if(top>1){cout<<"Expression Error: "<<OPND[top-1];return false;}return true;
}
int main()
{string s;top=0;getline(cin,s);//可以接受空格 
//	cout<<s;if(caculate(s)){cout<<"表达式的值为:"<<OPND[0];                                                 }
}

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

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

相关文章

Catalan 数 和 Stirling 数

这个也可以理解为栈&#xff0c;用 ( 表示 入栈 &#xff0c; ) 表示出栈 , 任何情况下表示入栈的 ( 都必须大于等于 ) 的个数 这个思路和入栈出栈的思路是等价的

ms-sql server sql 把逗号分隔的字符串分开

案例&#xff1a; sql 查询-字段里是逗号,分隔开的数组&#xff0c;查询匹配数据 sql 查询-字段里是逗号,分隔开的数组&#xff0c;查询匹配数据_sql server 数组匹配-CSDN博客 SQL SERVER 把逗号隔开的字符串拆分成行 SQL SERVER 把逗号隔开的字符串拆分成行_sqlserver拆分…

【暴力剪枝】CF1708D

https://codeforces.com/contest/1708/problem/D 题意 思路 这样的操作下&#xff0c;数列减的速度是非常快的&#xff0c;也就是说&#xff0c;易出现很多的0&#xff0c;0的操作没啥意义&#xff0c;所以我们要找到第一个 >0 的数对其后的序列进行排序&#xff0c;就能大…

【Edabit 算法 ★☆☆☆☆☆】Power Calculator

【Edabit 算法 ★☆☆☆☆☆】Power Calculator math numbers Instructions Create a function that takes voltage and current and returns the calculated power. Examples circuitPower(230, 10) // 2300 circuitPower(110, 3) // 330 circuitPower(480, 20) // 9600Not…

大数据平台开发经验

如果我是一个有着10年大数据平台开发经验的开发者&#xff0c;面试时可能需要准备以下知识 大数据生态系统&#xff1a;** 熟悉大数据技术栈&#xff0c;如Hadoop、Spark、Flink等&#xff0c;了解它们的原理、用途和优劣势。 分布式系统设计&#xff1a; 深入了解分布式系统的…

java项目运行时信息获取

大体思路如下&#xff0c;想要获取启动时处理器数量、jvm 相关信息&#xff0c;操作系统信息、运行机器信息 运行机器信息 import org.slf4j.Logger; import org.slf4j.LoggerFactory;import java.lang.invoke.MethodHandles;/*** 机器工具类*/ public abstract class ServerU…

051校园短期闲置资源置换平台

大家好✌&#xff01;我是CZ淡陌。一名专注以理论为基础实战为主的技术博主&#xff0c;将再这里为大家分享优质的实战项目&#xff0c;本人在Java毕业设计领域有多年的经验&#xff0c;陆续会更新更多优质的Java实战项目&#xff0c;希望你能有所收获&#xff0c;少走一些弯路…

git第一次推送出现推送被拒绝

前言 git 第一次推送出现以下错误 ! [rejected] master -> master (fetch first) error: failed to push some refs to ‘https://gitee.com/fengshangyunwang/iot-front-end.git’ hint: Updates were rejected because the remote contains work that you do hint: not …

Mac硬盘检测工具

Mac硬盘检测软件是一款用于检测和诊断Mac硬盘健康状态的工具&#xff0c;帮助用户及时发现潜在的硬盘问题&#xff0c;避免数据丢失和系统故障。通过全面的检测和报告功能&#xff0c;用户可以更好地了解自己的硬盘状况&#xff0c;确保数据的安全和可靠。给大家介绍几款好用的…

数字秒表VHDL启动暂停清零,源码和视频

名称&#xff1a;数字秒表VHDL启动暂停清零&#xff08;代码在文末付费下载&#xff09; 软件&#xff1a;Quartus 语言&#xff1a;VHDL 代码功能&#xff1a; 数字秒表 使用VHDL语言设置数字秒表。要求具有百分秒、秒和分钟显示,百分秒范围00-99,秒范围00-59,分钟范围0…

CMakeList 编写示例

cmake_minimum_required(VERSION 3.8) #指定cmake的最小版本 set(PROJECT_NAME Untitled_1) #初始化变量 project(${PROJECT_NAME} VERSION 1.0) #创建一个project set(CMAKE_AUTOMOC ON) #初始化内置变量, 该变量为Qt工程专属变量 set(CMAKE_AUTORCC ON) set(CMAKE_A…

【Python 千题 —— 基础篇】分割有效信息

题目描述 题目描述 有时候我们需要截取字符串以获取有用的信息&#xff0c;比如对于字符串 “日期&#xff1a;2010-10-29”&#xff0c;我们需要截取后面的 10 个字符来获取日期&#xff0c;以便进行进一步分析。编写一个程序&#xff0c;输入一个字符串&#xff0c;然后输出…

git仓删除当前仓且保留嵌套子仓--类似保留特定文件目录

当前git若有损坏需删除重新下载&#xff0c;但其还含有子仓&#xff0c;不能直接删除整体目录。清理方法如下&#xff1a; 分如下两种场景 1、若是子仓当前没有进行任何操作&#xff0c;即子仓可以临时移动 这种比较简单&#xff0c;分如下几步&#xff1a; step1:找到全部子…

视频播放音画同步处理

一、视频播放流程 播放一个视频&#xff0c;一般分一下几步完成 解复用&#xff08;Demux&#xff09;&#xff1a;在媒体文件中将音频数据、视频数据、字母数据分离出来。 二、播放参数说明 视频帧率&#xff1a;一秒钟需要显示的画面&#xff0c;比如25FPS&#xff0c;意思就…

el-upload实现上传文件夹

背景&#xff1a;如图一所示&#xff0c;最下面有一个黄色上传文件按钮&#xff0c;为手动上传而且上传区域有上传文件和上传文件夹的区分 所以需要在点击了上传文件夹做特殊处理使得el-upload可以上传文件夹 一、template区域 <el-uploadclass"upload-file"dra…

【COMP305 LEC 3 LEC 4】

LEC 3 A basic abstract model for a biological neuron 1. Weights of connections Neuron gets fired if it has received from the presynaptic neurons 突触前神经元 a summary impulse 脉冲, which is above a certain threshold. Signal from a single synapse突触 ma…

docker 构建jar包/vue镜像以及发布

1、maven 对项目进行jar/war打包&#xff1a; 如&#xff1a;my-notepad-service-1.006.jar 2、构建镜像&#xff1a; 新建Dockerfile内容有&#xff1a; FROM openjdk:8-jdk-alpine # 作者 MAINTAINER Yang douya # jar包添加到镜像中 第一个是maven打包jar 第二个为在镜像中得…

面试八股文:C++ 多态 继承 重载 虚函数

C 支持多态、继承和函数重载&#xff0c;这些是面向对象编程&#xff08;OOP&#xff09;的基本概念。以下是这些概念的简要介绍&#xff1a; 多态&#xff08;Polymorphism&#xff09;&#xff1a; 多态是面向对象编程的核心概念之一&#xff0c;它允许不同的子类对象对相同的…

项目通用pom.xml文件模版

pom.xml模版文件 <?xml version"1.0" encoding"UTF-8"?><project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/…

使用Spire.PDF for Python插件从PDF文件提取文字和图片信息

目录 一、Spire.PDF插件的安装 二、从PDF文件提取文字信息 三、从PDF文件提取图片信息 四、提取图片和文字信息的进阶应用 总结 在Python中&#xff0c;提取PDF文件的文字和图片信息是一种常见的需求。为了满足这个需求&#xff0c;许多开发者会选择使用Spire.PDF插件&…