C++中缀表达式 转 后缀表达式(求值)

2024-04-02 10:58

本文主要是介绍C++中缀表达式 转 后缀表达式(求值),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

菜鸟生成记(79)
输入:变量名(单个字符)和变量值
再输入中缀表达式,然后求值
输入
a 1
b 2
c 3
d 4
e 5
a+d*(b*(c+d)-e)//1+4*(2*(3+4)-5)
输出
37
#include<stdio.h>
#include<string.h>
#include<ctype.h>
#define N 100
struct st{char name;int value;
};
int find(st s[],char x)
{//变量名查询变量值for(int i=0;i<5;i++){if(x==s[i].name)return s[i].value;}
}
int level(char x)
{//查询运算符优先级if(x=='('||x==')')return 1;else if(x=='+'||x=='-')return 2;else if(x=='*'||x=='/')return 3;return 1;
}
int clu(int x,int y,char ch)
{//x与y进行
//x (ch) y运算
//返回 x(ch)yint sum=0;switch(ch){case '+':sum=x+y;break;case '-':sum=x-y;break;case '*':sum=x*y;break;case '/':sum=x/y;break;			}return sum;
}
/*
a 1
b 2
c 3
d 4
e 5
*/
int main()
{st s[N];//变量数组(储存变量名和变量值)int sum=0;int k=0;int top=-1;//栈指针char str[N]="a+d*(b*(c+d)-e)";//1+4*(2*(3+4)-5)//中缀表达式char post[N];//后缀表达式数组char t,stack_[N];//运算符栈/*a=1b=2c=3d=4e=5*///printf("%d\n",1+4*(2*(3+4)-5));for(int i=0;i<5;i++){scanf("%c%d",&s[i].name,&s[i].value);getchar();}scanf("%s",str);//输入中缀表达式(数学表达式) for(int i=0;i<strlen(str);i++){//islower:判小写;isupper:判大写 if(islower(str[i])||isupper(str[i])){//变量名 ,单个字符(大小写都行) post[k++]=str[i];}else//运算符 {if(str[i]==')')//遇到右括号出栈 {while(stack_[top]!='('){//出栈的符号放入后缀表达式数组中 post[k++]=stack_[top];top--;}top--;}else if(top==-1||level(str[i])>level(stack_[top])||str[i]=='('){//栈空,当前运算符优先级大于栈顶运算符优先级,当前运算符为左括号//三种情况运算符直接入栈 stack_[++top]=str[i];}else if(level(str[i])<=level(stack_[top])){//前运算符优先级小于等于栈顶运算符优先级//栈顶元素出栈,直到 前运算符优先级大于栈顶运算符优先级while(level(str[i])<=level(stack_[top])&&top!=-1){//出栈元素加入后缀表达式数组中 post[k++]=stack_[top];top--;}//当前运算符入栈 stack_[++top]=str[i];}}}printf("\n");while(top!=-1)//栈内剩余运算符也加入后缀表达式数组 post[k++]=stack_[top--];top=-1;/*****输出后缀表达式******/for(int i=0;i<k;i++)printf("%c ",post[i]);printf("\n"); /***********************/ top=-1;int num[N]={0};//数字栈,用于后缀表达式求值 for(int i=0;i<k;i++){if(islower(post[i])||isupper(post[i])){//变量名 ,单个字符(大小写都行)//find(s,x)在s数组中根据变量名查找变量值//然后入栈 num[++top]=find(s,post[i]);}else//运算符 {int x=num[top];int y=num[top-1];//x,y栈顶两个元素//clu(y,x,post[i])//post[i]运算符//clu函数根据运算符求出x和y的运算结果 sum=clu(y,x,post[i]);top-=2;//x,y出栈 num[++top]=sum;//运算结果入栈 }}printf("\n%d",sum);return 0;
}

这篇关于C++中缀表达式 转 后缀表达式(求值)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/869797

相关文章

使用C#代码计算数学表达式实例

《使用C#代码计算数学表达式实例》这段文字主要讲述了如何使用C#语言来计算数学表达式,该程序通过使用Dictionary保存变量,定义了运算符优先级,并实现了EvaluateExpression方法来... 目录C#代码计算数学表达式该方法很长,因此我将分段描述下面的代码片段显示了下一步以下代码显示该方法如

C++中实现调试日志输出

《C++中实现调试日志输出》在C++编程中,调试日志对于定位问题和优化代码至关重要,本文将介绍几种常用的调试日志输出方法,并教你如何在日志中添加时间戳,希望对大家有所帮助... 目录1. 使用 #ifdef _DEBUG 宏2. 加入时间戳:精确到毫秒3.Windows 和 MFC 中的调试日志方法MFC

Python在固定文件夹批量创建固定后缀的文件(方法详解)

《Python在固定文件夹批量创建固定后缀的文件(方法详解)》文章讲述了如何使用Python批量创建后缀为.md的文件夹,生成100个,代码中需要修改的路径、前缀和后缀名,并提供了注意事项和代码示例,... 目录1. python需求的任务2. Python代码的实现3. 代码修改的位置4. 运行结果5.

深入理解C++ 空类大小

《深入理解C++空类大小》本文主要介绍了C++空类大小,规定空类大小为1字节,主要是为了保证对象的唯一性和可区分性,满足数组元素地址连续的要求,下面就来了解一下... 目录1. 保证对象的唯一性和可区分性2. 满足数组元素地址连续的要求3. 与C++的对象模型和内存管理机制相适配查看类对象内存在C++中,规

在 VSCode 中配置 C++ 开发环境的详细教程

《在VSCode中配置C++开发环境的详细教程》本文详细介绍了如何在VisualStudioCode(VSCode)中配置C++开发环境,包括安装必要的工具、配置编译器、设置调试环境等步骤,通... 目录如何在 VSCode 中配置 C++ 开发环境:详细教程1. 什么是 VSCode?2. 安装 VSCo

C++11的函数包装器std::function使用示例

《C++11的函数包装器std::function使用示例》C++11引入的std::function是最常用的函数包装器,它可以存储任何可调用对象并提供统一的调用接口,以下是关于函数包装器的详细讲解... 目录一、std::function 的基本用法1. 基本语法二、如何使用 std::function

Spring Security 基于表达式的权限控制

前言 spring security 3.0已经可以使用spring el表达式来控制授权,允许在表达式中使用复杂的布尔逻辑来控制访问的权限。 常见的表达式 Spring Security可用表达式对象的基类是SecurityExpressionRoot。 表达式描述hasRole([role])用户拥有制定的角色时返回true (Spring security默认会带有ROLE_前缀),去

【C++ Primer Plus习题】13.4

大家好,这里是国中之林! ❥前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。有兴趣的可以点点进去看看← 问题: 解答: main.cpp #include <iostream>#include "port.h"int main() {Port p1;Port p2("Abc", "Bcc", 30);std::cout <<

C++包装器

包装器 在 C++ 中,“包装器”通常指的是一种设计模式或编程技巧,用于封装其他代码或对象,使其更易于使用、管理或扩展。包装器的概念在编程中非常普遍,可以用于函数、类、库等多个方面。下面是几个常见的 “包装器” 类型: 1. 函数包装器 函数包装器用于封装一个或多个函数,使其接口更统一或更便于调用。例如,std::function 是一个通用的函数包装器,它可以存储任意可调用对象(函数、函数

C++11第三弹:lambda表达式 | 新的类功能 | 模板的可变参数

🌈个人主页: 南桥几晴秋 🌈C++专栏: 南桥谈C++ 🌈C语言专栏: C语言学习系列 🌈Linux学习专栏: 南桥谈Linux 🌈数据结构学习专栏: 数据结构杂谈 🌈数据库学习专栏: 南桥谈MySQL 🌈Qt学习专栏: 南桥谈Qt 🌈菜鸡代码练习: 练习随想记录 🌈git学习: 南桥谈Git 🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈�