NYOJ--字首式計算
字首式計算
時間限制:1000 ms | 記憶體限制:65535 KB
難度:3
- 描述
-
先說明一下什麼是中綴式:
如2+(3+4)*5這種我們最常見的式子就是中綴式。
而把中綴式按運算順序加上括號就是:(2+((3+4)*5))
然後把運算子寫到括號前面就是+(2 *( +(3 4) 5) )
把括號去掉就是:+ 2 * + 3 4 5
最後這個式子就是該表示式的字首表示。
給你一個字首表示式,請你計算出該字首式的值。
比如:
+ 2 * + 3 4 5的值就是 37
- 輸入
-
有多組測試資料,每組測試資料佔一行,任意兩個操作符之間,任意兩個運算元之間,運算元與操作符之間都有一個空格。輸入的兩個運算元可能是小數,資料保證輸入的數都是正數,並且都小於10,運算元數目不超過500。
以EOF為輸入結束的標誌。 - 輸出
- 對每組資料,輸出該字首表示式的值。輸出結果保留兩位小數。
- 樣例輸入
-
+ 2 * + 3 4 5 + 5.1 / 3 7
- 樣例輸出
-
37.00 5.53
- 來源
解析:前面一直在研究中綴表示式和字尾表示式,這次做做字首表示式,不過思想還是一樣的,逆序著判斷幾種情況做不同的操作,存入運算元棧,然後將運算元棧頂兩元素與當前遇到的操作符計算即可,廢話不說直接上程式碼,程式碼註釋我覺得還是很詳細的哈!
#include <iostream> #include <stack> #include <string> #include <stdio.h> #include <stdlib.h> #include <algorithm> using std::endl; using std::cin; using std::cout; using std::string; using std::stack; double compute(double a,double b,char ch) { switch(ch) { case '+': return a+b; case '-': return a-b; case '*': return a*b; case '/': return a/b; } } //判斷是否為操作符 int isDigit(char ch) { if(ch=='+'||ch=='-'||ch=='*'||ch=='/') { return 1; }else{ return 0; } } int main() { string str; stack<double> numstack; //讀取一行字串 while(getline(cin , str)) { string res; for(int i=str.length()-1;i>=0;--i) {//將運算元入棧 if(isDigit(str[i])) {//如果當前字元是操作符 //從運算元棧中棧頂提取兩個數進行運算 double t1=numstack.top(); numstack.pop(); double t2=numstack.top(); numstack.pop(); double result=compute(t1,t2,str[i]); numstack.push(result); }else if(str[i]==' ') {//當前字元是空格不做處理 }else{ //當前字元是數字或者小數點 res+=str[i]; //判斷當前res中儲存的字串是否為一個單獨的數 if((i>0&&str[i-1]==' ')||(i==0)) {//如果前一個字元是空格的話則是一個單獨的數 reverse(res.begin(),res.end()); //轉換為double型別的數 double temp=atof(res.c_str()); numstack.push(temp); //重置res字串 res.clear(); } } } printf("%.2f\n",numstack.top()); //清空棧 while(!numstack.empty()) { numstack.pop(); } } return 0; }
相關文章
- 【計算機演算法】 求字首表示式的值計算機演算法
- 計算中綴表示式
- 分散式雲端計算分散式
- 字首中綴字尾表示式規則
- 從雲端計算到函式計算函式
- 函式計算——應用初探函式
- 分散式計算與Map Reduce分散式
- [分散式]分散式計算系統淺析分散式
- 分散式計算技術(上):經典計算框架MapReduce、Spark 解析分散式框架Spark
- 遷移 Express 到函式計算Express函式
- 表示式計算(棧的應用)
- 溫溼度計算露點函式函式
- 字首和與二維字首和
- 將算數表示式轉換成字尾表示式並計算結果
- pycuda-一些計算函式函式
- 遷移 Spring Boot 到函式計算Spring Boot函式
- 函式計算-HelloWorld應用開發函式
- 計算 CRC32 的逆函式函式
- 一個數學表示式的計算
- 字首和
- 字首樹
- (Day4)字首和&二維字首和
- 函式計算Python連線SQLServer小結函式PythonSQLServer
- 阿里雲 函式計算 域名配置問題阿里函式
- Serverless 實戰 —— 函式計算 + Typescript 實踐Server函式TypeScript
- 函式計算支援 MySQL 例項繫結函式MySql
- 使用棧結構計算中綴表示式
- Serverless 解惑——函式計算如何安裝字型Server函式
- 基於函式計算的 BFF 架構函式架構
- 筆記:PostgreSQL 、Node.js 、函式計算筆記SQLNode.js函式
- matchTemplate函式各個方法的計算公式函式公式
- 詳解 Apache SkyWalking OAP 的分散式計算Apache分散式
- 分散式計算的八個謬誤 - Ably分散式
- Python字串字首Python字串
- excel怎麼自己輸入公式計算 excel怎麼編輯函式進行計算Excel公式函式
- 製作表格統計函式計算Excel 2021簡體中文函式Excel
- C語言程式設計>第八週 ② 編寫函式fun,函式的功能是:根據以下公式計算,計算結果作為函式值返回。C語言程式設計函式公式
- MySql中SUM函式計算錯誤問題MySql函式
- 阿里雲函式計算 VSCode 使用,及部署 Docusaurus阿里函式VSCode