表达式(二)

后缀表达式由于其特殊性只需要操作数栈,不需要运算符栈,每当出现运算符就说明是对前面两个操作数进行操作

#include<bits/stdc++.h>
using namespace std;
char tok[30][20];
int tok_max;
int pos=1;int main(){tok_max=0;int num1=0;for(;;){int c=getchar();if(c=='@')break;if(c=='+'||c=='-'||c=='*'||c=='/'){tok[++tok_max][0]=c;}else if(c=='.'){sprintf(tok[++tok_max],"%d",num1);num1=0;}else{num1=num1*10+(c-'0');}}
//	for(int i=1;i<=tok_max;i++){
//		puts(tok[i]);
//	}stack<int>st;for(int i=1;i<=tok_max;i++){//操作数if(isdigit(*tok[i])){ int num2;sscanf(tok[i],"%d",&num2);st.push(num2);}//运算符else if(*tok[i]=='+'){  int num3=st.top();st.pop();int num4=st.top();st.pop();int num5=num4+num3;st.push(num5);}else if(*tok[i]=='-'){int num3=st.top();st.pop();int num4=st.top();st.pop();int num5=num4-num3;st.push(num5);}else if(*tok[i]=='*'){int num3=st.top();st.pop();int num4=st.top();st.pop();int num5=num4*num3;st.push(num5);}else if(*tok[i]=='/'){int num3=st.top();st.pop();int num4=st.top();st.pop();int num5=num4/num3;st.push(num5);}}printf("%d\n",st.top());return 0;
}

前缀表达式

前缀表达式用栈写相对麻烦,但由于运算符前置,可以方便地将其转化为二叉树,递归实现

#include<bits/stdc++.h>
using namespace std;
char tok[6000][30];
int tok_max;
int pos=1;struct TREE{double val;char op;struct TREE *l,*r;
}tr;void build_tree(struct TREE *tr){if(isdigit(*tok[pos])){sscanf(tok[pos],"%lf",&(tr->val));//tr->val=atof(tok[pos]);pos++;tr->l=NULL;tr->r=NULL;return;}else{tr->op=*tok[pos];pos++;tr->l=(struct TREE*)malloc(sizeof(struct TREE));tr->r=(struct TREE*)malloc(sizeof(struct TREE));build_tree(tr->l);build_tree(tr->r);return;}
}
/*
void x(struct TREE *tr){if(tr==NULL)return;x(tr->l);if(tr->l==NULL && tr->r==NULL){printf("%f ",tr->val);}else{printf("%c ",tr->op);}x(tr->r);
}*/double calc(struct TREE *tr){if(tr->l==NULL && tr->r==NULL){ //是操作数return tr->val;}else{if(tr->op=='+')return calc(tr->l)+calc(tr->r);if(tr->op=='-')return calc(tr->l)-calc(tr->r);if(tr->op=='*')return calc(tr->l)*calc(tr->r);if(tr->op=='/')return calc(tr->l)/calc(tr->r);}
}int main(){tok_max=1;for(;;){int num=scanf("%s",tok[tok_max]);if(num==EOF)break;tok_max++;}build_tree(&tr);//x(&tr);double ans=calc(&tr);printf("%f\n",ans);return 0;
}

PS:以上代码经常出现*tok[i]一类的表达,因为tok[i]可看做指向数组的指针,*tok[i]等价于tok[i][0],写起来简洁易懂

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

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

相关文章

基于深度学习网络的人员行为视频检测系统matlab仿真,带GUI界面

1.算法仿真效果 matlab2022a仿真结果如下(完整代码运行后无水印): 2.算法涉及理论知识概要基于GoogLeNet深度学习网络的人员行为视频检测系统是一个高度复杂的计算机视觉应用,它利用深度神经网络的强大功能来识别和分类视频中的人员行为。GoogLeNet,也称为Inception网络,…

Forrester Wave™报告:天翼云三项产品能力获评最高分!

8月5日,国际权威研究机构Forrester发布了《Forrester Wave™: 中国公有云平台厂商评测,2024Q3》报告。中国电信天翼云凭借前瞻性的发展战略和领先的产品能力,跻身行业头部玩家阵营。同时,中国电信天翼云在数据治理服务、网络和内容交付服务、先进通讯和区块链服务三项产品能…

从理念到实践,解构HBlock降本增效黑科技!

天翼云存储资源盘活系统HBlock 2024年线上技术分享会来啦!“新存储 更轻量” 天翼云存储资源盘活系统HBlock 2024年线上技术分享会来啦! 在2023年HBlock分享会之后 不少小伙伴积极参与了1PB免费尝鲜活动 好评如潮的同时也对HBlock有了更多期待! 那么 2024年轻量存储技术有哪…

21.python函数(return)

return 一、return语句 1、return是指定一个返回值 2、在python中创建一个函数 ,可以用return语句指定返回的的值,这个返回值可以是任意的类型 3、return语句在同一个函数中可以出现多次,但是只有有一个得到执行,就会直接结束函数的执行。return后面的语句不执行了 4、retu…

C++ - 二级指针动态内存申请与释放

C语言描述: #include "stdio.h" #include "stdlib.h" #include "assert.h"void InitArray(int** Array, int row, int cols) {for (int i = 0; i < row; i++){for (int j = 0; j < cols; j++){Array[i][j] = i + j;}} } void PrintfArray…

一招致胜!天翼云对象存储攻克数据存、管、用难题!

天翼云对象存储(CT-ZOS,Zettabyte Object Storage)是一款海量、弹性、高可靠、高性价比的存储产品,也是专门针对云计算、大数据和非结构化数据的海量存储形态,通过S3协议和标准的服务接口,提供图片、音视频、文本等非结构化数据的云存储服务,助力企业高效应对数据存储挑…

一文搞懂C/C++常用编译器

1. C++ 编译器介绍1.1. MSVC1.1.1. Visual C++与Visual Studio的版本对应关系 1.1.2. 工具链的主要工具1.2. GCC1.2.1. GCC的主要优点 1.2.2. GCC的常用工具 1.2.3. MinGW1.3. Clang/LLVM1.3.1. Clang介绍 1.3.2. Clang与LLVM的关系 1.3.3. Clang/LLVM与GCC2. C++ 编译器的安装…

主打一个免费:英智LLM推理API,主流大模型API任你选!

人工智能(AI)技术的飞速发展已经成为各行各业的关键驱动力,尤其是大语言模型(LLM)正在成为推动下一波技术创新浪潮的颠覆性力量。开发者如何享受LLM带来的红利,创造出优秀的应用?实践证明,使用大语言模型API,可以有事半功倍的效果! 部署过大模型的小伙伴应该都清楚,…

阿里云微服务引擎及 API 网关 2024 年 6 月产品动态

阿里云微服务引擎及 API 网关 2024 年 6 月产品动态

docker 简单入门1

这里写自定义目录标题DockerDocker安装(centos) Docker启动、停止、查看状态 Docker其他命令(常用)查询镜像 安装镜像在线安装镜像 离线安装镜像(说明可能不标准)启动容器 重启容器 停止容器 修改容器中的配置文件(说明可能不标准) docker comimt docker save docker l…

vue 项目使用@vue-office/docx word 纯前端v 也支持后端接口方式

只是做个记录,防止忘记。 安装依赖 @vue-office/docx vue 2 的写法 vue3 同理自己改造。 记得一定放在public 文件夹下 下面代码<template><div style="height: 100%"><el-button type="primary" @click="downWord">下载文档…

Leetcode: 1484. Groups Sold Products By The Date

题目要求如下:输入的数据为要求按照日期查询出每日销售数量及相应产品的名称,并按照字符顺序进行排序。 下面是实现的代码: import pandas as pddef categorize_products(activities: pd.DataFrame) -> pd.DataFrame:val = activities.drop_duplicates().groupby("sell…