1. 程式人生 > >將中綴表示式轉化為逆波蘭式(c++實現)

將中綴表示式轉化為逆波蘭式(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用浮點