中缀试转后缀试及前缀试并计算其结果

  1 /*
  2         参考大神nb的代码,感觉思路不错!终于搞明白了!一开始不明白在计算表达式的时候,利用栈到底做了什么!现在感觉我们利用栈就是模拟我们书面上计算表达式,
  3        将优先级高的运算先计算出来,然后放进栈中,等待下一次的计算
  4 */
  5 #include<iostream> 
  6 #include<string> 
  7 #include<stack>
  8 #include<cstdio>
  9 using namespace std;
 10 
 11 class node
 12 {
 13 public:
 14      double ret;
 15      string prefix, suffix;//前缀表达式和后缀表达式 
 16      node()
 17      {
 18          ret=0;
 19          prefix=suffix=""; 
 20      } 
 21 };
 22 
 23 stack<node>optd;//操作数栈
 24 stack<char>optr;//操作符栈
 25 
 26 char formula[1000];//表达式以"=" 结束 
 27 
 28 int cmp(char ch)//定义符号的优先级
 29 {
 30    switch(ch)
 31    {
 32       case '#': return -2;
 33       case '=': return -1;
 34       case '+':
 35       case '-': return 1;
 36       case '*':
 37       case '/': return 2;
 38       case '(': return 3;
 39       case ')': return 0;
 40    }
 41    return -2;
 42 }
 43 
 44 double deal(double x, char ch, double y)
 45 {
 46    switch(ch)
 47    {
 48        case '+': return x+y;
 49        case '-': return x-y;
 50        case '*': return x*y;
 51        case '/': return x/y;
 52    }
 53    return 0.0;
 54 }
 55 
 56 void cal()
 57 {
 58    int i=0, n;
 59    node num, aTmp, bTmp;
 60    while(optr.top()!='=')
 61    {
 62       if(formula[i]>='0' && formula[i]<='9')
 63       {
 64            sscanf(formula+i, "%lf%n", &num.ret, &n);
 65            num.prefix.assign(formula+i, n);
 66            num.suffix.assign(formula+i, n);
 67            i+=n;
 68            optd.push(num);
 69       }
 70       else
 71       {
 72            if(optr.top()=='(' && formula[i]==')')//消除一对括弧 
 73            {
 74          optr.pop();
 75          ++i;
 76          }
 77            if(cmp(formula[i]) > cmp(optr.top()) || optr.top()=='(')//当前运算符大于栈顶运算符直接进栈
 78      {
 79          optr.push(formula[i]);
 80          ++i;
 81      }
 82      else
 83      {
 84         char ch=optr.top(), preTmp[]={ch, ' ', '\0'}, sufTmp[]={' ', ch, '\0'} ;
 85         optr.pop();//弹出一个栈顶操作符 
 86         bTmp=optd.top(); optd.pop();//得到第二个操作数 
 87         aTmp=optd.top(); optd.pop();//得到第一个操作数 
 88         aTmp.ret=deal(aTmp.ret, ch, bTmp.ret);
 89         
 90         aTmp.suffix+=" " + bTmp.suffix + sufTmp;//得到运算后的后缀式子
 91         aTmp.prefix=preTmp + aTmp.prefix + " " + bTmp.prefix;//得到运算前的后缀式子
 92         optd.push(aTmp);//不要忘记将计算的结果放入栈中 
 93      }
 94       }
 95    }
 96    optr.pop();//别忘记弹出栈顶上的'=' 
 97 }
 98 
 99 int main()
100 {
101    optr.push('#');//初始化栈顶操作符是‘#’ 
102    while(cin>>formula)
103    {
104        cal();
105        node ans=optd.top(); optd.pop();
106        cout<<"表达式结果:"<<ans.ret<<endl<<"前缀试:"<<ans.prefix+'='<<endl<<"后缀试:"<<ans.suffix+'='<<endl; 
107    }
108    return 0;
109 }

 

转载于:https://www.cnblogs.com/hujunzheng/p/3785647.html

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

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

相关文章

ros如何编译python文件_Python为ROS编写一个简单的发布者和订阅者

Python为ROS编写一个简单的发布者和订阅者1.创建工作空间1.1建立文件夹hello_rospy,再在该目录下建立子目录src,并创建工作空间mkdir -p ~/hello_rospy/srccd ~/hello_rospy/srccatkin_init_workspace1.2 编译cd ~/hello_rospy/catkin_make1.3设置运行环境echo "source ~/…

php整站防注入程序,php通用防注入程序 推荐

function jk1986_checksql(){$bad_str "and|select|update|‘|delete|insert|*";$bad_Array explode("|",$bad_str);/** 过滤Get参数 **/foreach ($bad_Array as $bad_a){foreach ($_GET as $g){if (substr_count(strtolower($g),$bad_a) > 0){echo &…

表达式建树

//用数组实现树 1 #include<iostream> 2 #include<ctype.h>3 #include<cstring>4 #define N 100005 #define optd 16 #define optr 27 using namespace std;8 int treeL[N], treeR[N];9 class node 10 { 11 public: 12 int flag;//区分当前节点是操作符还…

python label标签的作用_label标签的作用是什么?

label标签的作用是为鼠标用户改进了可用性&#xff0c;当用户点击【】标签中的文本时&#xff0c;浏览器就会自动将焦点转到和该标签相关联的控件上。label标签的作用&#xff1a;一、标签定义及用法在html中&#xff0c;标签通常和标签一起使用&#xff0c;标签为input元素定义…

java异常自定义返回信息,Spring Boot 如何自定义返回错误码错误信息

说明在实际的开发过程中,很多时候要定义符合自己业务的错误码和错误信息&#xff0c;而不是统一的而不是统一的下面这种格式返回到调用端INTERNAL_SERVER_ERROR(500, "Internal Server Error"),下面我们来看看如何将我们自定义的错误码和错误信息返回到调用端。1 自定…

文件管理系统_Python学习第170节--Linux文件管理系统实际操作和具体介绍

【每天几分钟&#xff0c;从零入门python编程的世界&#xff01;】上节我们简单了解了Linux文件管理系统&#xff0c;现在我们学习它的实际操作。首先我们解释下~和/的区别。~之前我们介绍过&#xff0c;我们说~是Linux系统的根目录&#xff0c;其实这个说法是不准确的&#xf…

redis 计数器 java_Redis 的 8 大应用场景!

之前讲过Redis的介绍&#xff0c;及使用Redis带来的优势&#xff0c;这章整理了一下Redis的应用场景&#xff0c;也是非常重要的&#xff0c;学不学得好&#xff0c;能正常落地是关键。下面一一来分析下Redis的应用场景都有哪些。1、缓存缓存现在几乎是所有中大型网站都在用的必…

sql中in与php数组,格式化SQL“IN”子句的PHP数组

我正在尝试在数据库中查询“product_id”包含在产品ID数组中的记录.该数组是多选输入(< select>)的结果,如下所示&#xff1a;$clients Array ([0] > 80000016-1302638679[1] > 8000003B-1329924004)我想将该数组传递给sql语句的“IN”子句,例如&#xff1a;$sql …

汇编汉诺塔

1 .3862 .model flat3 .stack 40964 include io.h5 ExitProcess proto near32 stdcall, ExitCode:dword6 cr equ 0dh7 lf equ 0ah8 .data9 string1 byte "请输入汉诺塔数&#xff1a;", cr, lf 10 strNum byte 10 dup(?) 11 result byte 10 dup( ) 12 byte c…

oracle精度说明符1~38_Oracle 错误代码总结及解决方案

ORA-00001&#xff1a;违反唯一约束条件(主键错误)ORA-00028&#xff1a;无法连接数据库进程ORA-00900&#xff1a;无效sql语句ORA-00904&#xff1a;字段名写错或是建表时最后一个字段有逗号ORA-00907&#xff1a;缺少右括号ORA-00911&#xff1a;无效字符ORA-00917&#xff1…

opencv为matlab,OpenCV与matlab部分函数的对应关系(转)

2、matlab中的zeros函数相当于OpenCV中的cvSetZero函数。3、matlab中的两矩阵点乘 .*相当于OpenCV中的cvMul函数。4、matlab中的两矩阵点除 ./相当于OpenCV中的cvDiv函数。5、matlab中的两矩阵相加 相当于OpenCV中的cvAdd函数。6、matlab中的两矩阵相减 -相当于OpenCV中的cvSub…

预测分析算法的设计与实现_基于LD(编辑距离算法)的单词速记数据库分析设计与实现...

2020-21-1学期《最新数据库管理系统》结课作业展示。作者&#xff1a;牟伦利 褚四浩 陈思琴 曹鹏飞(电商11802)分工陈思琴&#xff1a;系统需求分析 、系统相关算法分析和ER图曹鹏飞&#xff1a;系统数据字典 、业务流程图、数据流程图和PPT制作牟伦利&#xff1a;存储过程、触…

参考文献要不要首行缩进_参考文献格式要求(2015-2016-2)

1参考文献统一使用下列格式一、参考文献构成参考文献分为两个部分&#xff1a;正文部分的夹注和文后参考文献处的参考文献条目。1.正文部分的夹注(作者的姓页码)正文引用了他人的观点后&#xff0c;在后面紧靠引用处给出夹注。例如&#xff1a;The contemporary text linguisti…

c++与java中子类中调用父类成员的方法

1 java中&#xff1a;2 import java.util.Scanner;3 public class ClassTest{4 public static void main(String args[]){5 child chnew child(2);6 parent pch;7 p.print();8 //p.print2();//调用错误&#xff0c;父类中没有改成员方法&#xff0c…

华为畅享max有没有人脸识别_华为畅享7s有人脸识别吗 让我来告诉你

现在大家使用手机的频率越来越频繁&#xff0c;手机也为我们提供了许多的便利&#xff0c;今天小编也来说一下这个华为畅享7s有人脸识别吗 让我来告诉你相关的文章&#xff0c;这个操作其实不复杂&#xff0c;接下来就给大家介绍一下华为畅享7s有人脸识别吗 让我来告诉你&#…

matlab knnsearchidx,matlab查找最临近搜索knnsearch

[Idx,D] knnsearch(___) additionally returns the matrix D, using any of the input arguments in the previous syntaxes. D contains the distances between each observation in Y and the corresponding closest observations in X.使用先前语法中的任何输入参数返回矩阵…

php导出excel数据代码,phpspreadsheet导出数据到Excel的方法介绍(代码示例)

本篇文章给大家带来的内容是关于phpspreadsheet导出数据到Excel的方法介绍(代码示例)&#xff0c;有一定的参考价值&#xff0c;有需要的朋友可以参考一下&#xff0c;希望对你有所帮助。之前我们使用PHP导出Excel数据时使用的是PHPExcel库&#xff0c;但是phpoffice已经官方宣…

sp 导出unity哪个_GitHub上发现的一个导出Unity3D场景数据的工具

1、源地址2、导出脚本脚本名:Unity3DExporter.csC#using UnityEditor;using UnityEngine;using System;using System.Collections.Generic;using System.Linq;using System.IO;public class Unity3DExporter : EditorWindow{private static bool mIsWindowOpen;private bool mE…

poj3422 Kaka's Matrix Travels(最小费用最大流问题)

1 /*2 poj3422 Kakas Matrix Travels 3 不知道 k次 dp做为什么不对&#xff1f;&#xff1f;&#xff1f;4 看了大牛的代码&#xff0c;才知道还可以这样做&#xff01; 5 开始没有理解将a 和 a‘ 之间建立怎样的两条边&#xff0c;导致程序一直陷入死循环&#xff0c;真心花了…

java把对象转成图片格式转换器安卓版,java 万能图片格式转换

话不多说&#xff0c;直接上代码import java.awt.image.BufferedImage;import java.awt.image.Raster;import java.io.File;import java.io.IOException;import javax.imageio.ImageIO;public class IOUtil {public static void pgm2png(String src, String dest) throws IOExc…