將中綴表示式轉化為逆波蘭式(c++實現)
<pre name="code" class="cpp">/************************************************************************* > File Name: ReversePolish.cpp > Author: Shaojie Kang > Mail: [email protected] > Created Time: 2015年09月16日 星期三 11時17分04秒 > Problem: 將中綴表示式轉化為逆波蘭式,並計算 ************************************************************************/ #include<iostream> #include<string> #include<stack> #include<cctype> #include<map> #include<cstdlib> #include<vector> using namespace std; /* 優先順序定義 */ map<string, int> precedence; /* transfer function */ vector<string> Transfer(string &str) { vector<string> result; stack<string> operators; if(str.empty()) return result; str.insert(0, 1, '('); str.push_back(')'); int size = str.size(); for(int i = 0; i < size; ++i) { // 忽略空格 if(str[i] == ' ') continue; // 提取數字 if(isdigit(str[i])) { string temp; while(i < size && isdigit(str[i])) { temp += str[i]; ++i; } result.push_back(temp); --i; continue; } // 將(壓入棧 if(str[i] == '(') operators.push(string(1, str[i])); // 遇到右括號是,左括號之前的操作符都要出棧 else if(str[i] == ')') { while(operators.top() != "(") { result.push_back(operators.top()); operators.pop(); } operators.pop(); // 左括號出棧 } else if(operators.empty() || precedence[string(1, str[i])] > precedence[operators.top()]) operators.push(string(1, str[i])); else // 當前操作符的優先順序大於棧頂操作符的優先順序 { // 優先順序大於當前操作符的操作符都要出棧 while(!operators.empty()) { string op = operators.top(); if(precedence[op] >= precedence[string(1, str[i])]) { result.push_back(op); operators.pop(); } else break; } operators.push(string(1, str[i])); // 將當前操作符號入棧 } } return result; } // 計算逆波蘭式 int Calculate(string &operations) { vector<string> result = Transfer(operations); stack<int> nums; for(int i = 0; i < result.size(); ++i) { if(isdigit(result[i][0])) nums.push(atoi(result[i].c_str())); else { int num2 = nums.top(); nums.pop(); int num1 = nums.top(); nums.pop(); if(result[i] == "+") nums.push(num1 + num2); else if(result[i] == "-") nums.push(num1 - num2); else if(result[i] == "*") nums.push(num1 * num2); else nums.push(num1 / num2); } } return nums.top(); } void print(const vector<string> nums) { for(int i = 0; i < nums.size(); ++i) cout<<nums[i]<<" "; cout<<endl; } int main() { precedence["("] = -1; precedence["+"] = precedence["-"] = 0; precedence["*"] = precedence["/"] = 1; string str("5/4+2*(3+2)*10"); cout<<Calculate(str)<<endl; return 0; }
相關推薦
將中綴表示式轉化為逆波蘭式(c++實現)
<pre name="code" class="cpp">/************************************************************************* > File Name: ReversePol
【模板小程序】任意長度十進制數轉化為二進制(java實現)
轉換 obi number 格式 bigint reverse com rev ole 媽媽再也不用擔心十進制數過大了233 import com.google.common.base.Strings; import java.math.BigInteger; impor
C語言利用棧實現將中綴表示式轉換為字尾表示式(即逆波蘭式)
輸入計算表示式如:(1-3)*4+10/5 輸出的逆波蘭式:1 3 - 4 * 10 5 / + 碼程式碼時臉上洋溢著的神祕的微笑 #include <stdio.h> #include <stdlib.h> #include
中綴表示式轉化為字尾表示式(逆波蘭表示式)
1.將中綴表示式轉化為字尾表示式 字尾表示式也叫作逆波蘭表示式,主要是運用棧的後進先出思想,下面就講講我自己的思考, 假設中綴表示式為:2*(2+1)-6(4-2)#,則字尾表示式為:2 2 1 + * 6 4 2 - / -; 首先依次遍歷中綴表示式,遇到運算元字元則直接輸出(數字字元
JavaScript中綴表達式轉為逆波蘭式(四則運算)
。。 刪除 並且 asc 情況 暫存 運算符 pan true 實現過程: 1.首先創建兩個空數組,result用來存放結果,temp用來存放符號;再創建一個符號集ops存放+-*/符號 2.轉表達式字符為數組,開始遍歷數組 3.如果遇到運算符,直接推入結果數組 4.遇到括
逆波蘭式(字尾表示式)的表達求值
逆波蘭表示式求值 [編輯]虛擬碼 while有輸入符號 讀入下一個符號IF是一個運算元 入棧ELSE IF是一個操作符 有一個先驗的表格給出該操作符需要n個引數IF堆疊中少於n個運算元 (錯誤) 使用者沒有輸入足夠的運算元Else,n個操作數出棧計算操作符。將計算所得的
表示式求值(逆波蘭式)
表示式求值 時間限制:3000 ms | 記憶體限制:65535 KB 難度:4 描述ACM隊的mdd想做一個計算器,但是,他要做的不僅僅是一計算一個A+B的計算器,他想實現隨便輸入一個表示式都能求出它的值的計算器,現在請你幫助他來實現這個計算器吧。 比如輸入
利用棧將中綴表示式轉換為字尾表示式並進行計算
[問題描述] 中綴表示式是最普通的一種書寫表示式的方式,而後綴表示式不需要用括號來表示,計算機可簡化對字尾表示式的計算過程,而該過程又是棧的一個典型應用。 [實驗目的] (1) 深入理解棧的特性。 (2) 掌握棧結構的構造方法。 [實驗內容及要求]
表示式/如何將中綴表示式轉化成字尾表示式
首先介紹下什麼是中綴表示式,字尾表示式。 表示式一般分為字首表示式,中綴表示式和字尾表示式。其中我們最為熟悉的是中綴表示式,也就是書本上最常用的表示形式。中綴表示式是將運算子放在兩個運算元的中間。 字首表示式是將運算子放在兩個運算元之前。字尾表示式(又稱逆波蘭表示式)是將運
"括號匹配, 中綴表示式轉化為字尾表示式, 計算中綴表示式, 計算字尾表示式"完整程式碼
核心程式碼: ---------------- /* Calculate infix expression */ double calc_infix_expression(const char *infixexp) { Stack operator_stk, operand_stk;
將算術表示式轉換成四元式的程式實現
第一部分:實驗內容描述 29. 題目:將算術表示式轉換成四元式的程式實現 設計內容及要求:設計一個語法制導翻譯器,將算術表示式翻譯成四元式。要求: 先確定一個定義算術表示式的文法,為其設計一個語法分析程式,為每條產生式配備一個語義子程式,按照一遍掃描的語法制導翻譯方法,實現翻譯程式。對使
逆波蘭式(字尾式)
逆波蘭式式波蘭邏輯學家盧卡西維奇發明的一種表示表示式的方法。這種表示方法把運算子寫在運算物件的後, 例如把a+ba+ba+b寫成 ab+ab+ab+,所以也稱為字尾式。這種表示法的有嗲你是根據運算物件和運算子的出現次序進行計算,不需要使用括號,也便於用棧來求值。
練習7-3 將陣列中的數逆序存放(20 分)
本題要求編寫程式,將給定的n個整數存入陣列中,將陣列中的這n個數逆序存放,再按順序輸出陣列中的元素。輸入格式:輸入在第一行中給出一個正整數n(1)。第二行輸入n個整數,用空格分開。輸出格式:在一行中輸出這n個整數的處理結果,相鄰數字中間用一個空格分開,行末不得有多餘空格。輸入
實驗7-1-3 將陣列中的數逆序存放(20 分)
/* 時間:2018年4月6日16:16:50 思路:第一個和最後一個數字進行交換 */ #include<stdio.h> #define N 10 int main() { int
循環鏈表的創建、插入、刪除、逆序、顯示(C++實現)
i++ pos str pre hide mar add 這樣的 itl 對於單鏈表,因為每一個結點僅僅存儲了向後的指針。到了尾標誌就停止了向後鏈的操作,這樣,其中某一結點就無法找到它的前驅結點了。 對於單鏈表的操作大家能夠看我的這篇博客http://
專為新手入門二叉樹(C實現)
本篇部落格主要涉及二叉樹的基本操作,建立,三種遍歷,求節點等(C寫法)。 二叉樹作為資料結構的難點,想必讓很多人望而生畏,各種複雜的程式碼和演算法實在讓人頭大,博主也是近期剛接觸二叉樹,對於二叉樹的探究也不是很深刻,所以有紕漏還請體諒。 1.首先了解下二叉樹 二
鄰接表與逆鄰接表(陣列實現)
配一張圖: 比如H[1] 下面有四個數(-1也是的) -1,0, 3, 5; 就說明A[0] 是點 1 的弧頭, A[3] 是 1 的弧頭, A[5] 也是1 的弧頭; 但是一個數組的一個小單元之能存一個數怎麼辦呢, 這個時候就是next的用處了; 我們讓next[5]
單鏈表的逆置(C++實現)
單鏈表以及逆置是什麼就不說了,就簡單說一下思想: 連結串列的初始狀態: 具體的方法就是將頭節點後面的節點,依次通過指標指向,插入head頭節點之後,即可完成逆置過程. 示意圖(這裡我寫一下中間處理流程,因為這樣比較直觀.第一次的處理與正常處理雷同): 需要注意的
兩個有序單鏈表歸併為一個有序單鏈表(c實現)
兩個有序單鏈表歸併為一個有序單鏈表 c程式碼: //定義節點 struct ListNode { int m_nValue; ListNode* m_pNext; } ; Lis
Excel日期/時間儲存數值轉換為具體日期/時間(java實現)
在用POI的事件模型eventusermodel讀取大容量Excel時發現讀取的日期、時間格式輸出後是浮點數字符串,然而沒有找到有類似於usermodel的分格式讀取的方法,於是編寫一個工具類,把獲取的浮點數轉換成日期/時間格式,增加可用性。 Excel用浮點