后缀表达式求值

news/2024/11/29 4:41:35/

题目要求:

后缀表达式求值:建立一个操作数栈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.ppmy.cn/news/1168296.html

相关文章

【rust/树莓派】使用rppalembedded-graphics控制st7789 LCD屏幕

说在前面 树莓派版本&#xff1a;4bLCD模块&#xff1a;ST7789V2 240*280 LCD树莓派系统&#xff1a;Linux raspberrypi 5.15.76-v8 #1597 SMP aarch64 GNU/Linuxrust版本&#xff1a;rustc 1.73.0 模块详情 某雪的1.69inch LCD模块&#xff0c;包含杜邦线 准备工作 树莓派…

面试题-React(十七):如何使用RTK进行状态管理

Redux Toolkit&#xff08;RTK&#xff09; 是一个强大的工具集&#xff0c;旨在简化和改进Redux的使用。它提供了一组工具和约定&#xff0c;使Redux的配置和编写更加直观和高效。 一、Redux Toolkit简介 Redux Toolkit是一个由Redux官方团队开发和维护的库&#xff0c;旨在…

数据回归算法 | Python逻辑回归

逻辑回归是一种经典的机器学习算法,用于解决二分类问题。 它常被用于预测某个事件发生的概率,通过将输入特征映射到一个概率值来进行分类。 简单聊聊 逻辑回归就像一位智能的侦探,根据一些线索(输入特征)判断某件事情是否会发生。 它将这些线索组合起来,计算出一个关于…

【Java 进阶篇】深入理解 Bootstrap 导航条与分页条

Bootstrap 是一个强大的前端框架&#xff0c;为网页和应用程序开发提供了丰富的组件和工具。其中&#xff0c;导航条和分页条是两个常用的组件&#xff0c;用于创建网站的导航和分页功能。本篇博客将深入探讨 Bootstrap 导航条和分页条的使用&#xff0c;适用于那些希望提升网页…

YOLOv5算法改进(16)— 增加小目标检测层 | 四头检测机制(包括代码+添加步骤+网络结构图)

前言:Hello大家好,我是小哥谈。小目标检测层是指在目标检测任务中用于检测小尺寸目标的特定网络层。由于小目标具有较小的尺寸和低分辨率,它们往往更加难以检测和定位。YOLOv5算法的检测速度与精度较为平衡,但是对于小目标的检测效果不佳,根据一些论文,我们可以通过增加检…

SpringCloud 微服务全栈体系(一)

第一章 认识微服务 随着互联网行业的发展&#xff0c;对服务的要求也越来越高&#xff0c;服务架构也从单体架构逐渐演变为现在流行的微服务架构。这些架构之间有怎样的差别呢&#xff1f; 一、单体架构 单体架构&#xff1a;将业务的所有功能集中在一个项目中开发&#xff…

ant的Path-like结构

ant可以使用path和classpath结构指明路径。path和classpath可以包含内嵌的元素&#xff0c;类似下面的通用形式&#xff1a; <classpath><pathelement path"${classpath}"/><pathelement location"lib/helper.jar"/> </classpath>…

华为OD VLAN资源池(100分)【java】B卷

华为OD统一考试A卷+B卷 新题库说明 你收到的链接上面会标注A卷还是B卷。目前大部分收到的都是B卷。 B卷对应20022部分考题以及新出的题目,A卷对应的是新出的题目。 我将持续更新最新题目 获取更多免费题目可前往夸克网盘下载,请点击以下链接进入: 我用夸克网盘分享了「华为O…