中綴試轉后綴試及前綴試并計算其結果

  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.pswp.cn/news/531990.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/531990.shtml
英文地址,請注明出處:http://en.pswp.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…