棧 表示式求值

2021-10-04 14:58:25 字數 1605 閱讀 3960

核心演算法思想:

1.運用兩個棧,乙個存運算子,乙個存數值

2.以』#『做為標誌位,開頭或者結尾

3.檢查當前字元,若當前字元為數值,則加入數值棧,若為運算子,則檢驗當前運算子的優先順序,

1)若當前運算子優先順序大於棧頂優先順序,則把該運算子壓入棧

2)若當前運算子優先順序等於棧頂優先順序(括號的情況),則彈出當前棧頂運算子

3)若當前預算符的優先順序小於棧頂優先順序,則彈出當前運算子棧頂元素,以及資料棧的兩個棧頂元素,進行運算,並把運算後的值存入資料棧中

4.迴圈進行直到運算子棧頂元素等於當前字元

算符間的優先關係如下表所示:

直接上**,**中有注釋(注意結尾要以#結尾)

#include

#include

#include

using

namespace std;

//該全域性變數存放的是所以操作符排序,目的是得知其下標,可以找出相應的優先順序

map<

char

,int

> _mapoperator,,

,,,,

};double

calculation

(double a,

double b,

char op)

//計算相應的加減乘除

}char

getpriority

(char oper1,

char oper2)

//獲取oper1與oper2之間的優先順序,,

,,,,

,};int index1 = _mapoperator[oper1]

;int index2 = _mapoperator[oper2]

;return priority[index1]

[index2];}

/*演算法思想:

1.運用兩個棧,乙個存運算子,乙個存數值

2.以』#『做為標誌位,開頭或者結尾

3.檢查當前字元,若當前字元為數值,則加入數值棧,若為運算子,則檢驗當前運算子的優先順序,

1)若當前運算子優先順序大於棧頂優先順序,則把該運算子壓入棧

2)若當前運算子優先順序等於棧頂優先順序(括號的情況),則彈出當前棧頂運算子

3)若當前預算符的優先順序小於棧頂優先順序,則彈出當前運算子棧頂元素,以及資料棧的兩個棧頂元素,進行運算,並把運算後的值存入資料棧

中4.迴圈進行直到運算子棧頂元素等於當前字元

*/double

result

(string &expression)

//核心**

else

i++;}

else}}

return expre.

top();

}int

main()

結果展示

表示式求值(棧)

時間限制 3000 ms 記憶體限制 65535 kb 難度 4 描述 acm隊的mdd想做乙個計算器,但是,他要做的不僅僅是一計算乙個a b的計算器,他想實現隨便輸入乙個表示式都能求出它的值的計算器,現在請你幫助他來實現這個計算器吧。比如輸入 1 2 4 程式就輸出1.50 結果保留兩位小數 輸入...

棧 表示式求值

把運算的處理專門放在乙個函式裡,然後通過優先順序的判斷去呼叫函式,注意那個 還是放在else if裡面吧,不要和運算混在一起了 includeusing namespace std const int n 1e5 10 stacks1 stacks2 int flag 0 處理 四個 mapcmp ...

棧應用 表示式求值

include stdafx.h include using namespace std const int explenght 20 const int stack init size 20 const int stack incrment 10 templateclass stack stack...