鍊錶模擬 字首表示式,波蘭式求解

2021-10-05 16:17:36 字數 2552 閱讀 9055

題目中只含有加減乘除,數字可以是浮點數,都是二目運算

這裡的想法很直接,採用鍊錶模擬,但要注意的情況很多(不難乙個乙個分析就好了)

從左向右掃瞄,每次檢查三個

遇到《符號,數字,數字》,直接運算出結果,代替這三個(注意此時,如果下乙個也是數字,就要回到起點再次掃瞄,因為《數字,數字,符號》的模式不存在)

遇到《符號,符號,數字》,跳到第二個符號位置,繼續後移

遇到《符號,數字,符號》,跳到第二個符號位置,繼續檢查

最後只剩乙個結果就是答案。

例如

-+5

*3-3

2*18

-+5*

31*1

8-+5

*318

-+53

8-88

0

#include

#include

#include

using

namespace std;

#define see(x) couttypedef

struct node

}listnode;

class

solsol

(string s)

~sol()

void

init

(string &s)

nowc= s.

at(ptr);if

(isop

(nowc)

)else

rear-

>next = temp;

rear = temp;}}

bool

isop

(char ch)

double

getnumber

(int

&ptr, string &s)

return

atof

(num);}

void

showans()

else

if(p3-

>op !=

'0')

else

} p2 = p1-

>next;

p3 = p2-

>next;}}

printf_s

("%f\n"

,p->data)

;delete p;

}void

update

(listnode*

&p)double

getcalculate

(char op,

double x,

double y)

return ans;

}private

: listnode *m_head;};

intmain()

常規解法,調換方向,從右向左處理

遇到數字就入棧

遇到符號則將棧頂數字出棧計算(注意是先出的op後出的),結果入棧

直到棧裡只有乙個數字

其他都很簡單,有個細節需要注意

當查詢數字傳入的是引用時,在迴圈中容易出現重複加減

例如下面的例子,當x從f2中返回時,他的值是否已經減過1,要小心處理,建議在f2中做乙個恢復操作,在外人看好像,x就自減了一次,就取出了資料。

voidf(

)else

x--;}

}voidf2(

int&x)

x++;//恢復乙個,好像就只操作了乙個x

}

#include

#include

#include

#include

using

namespace std;

#define see(x) coutsolsol

(string s)

~sol()

void

init

(string &s)

else

end--

;//細節

}printf_s

("%f\n"

, nums.

top())

;}bool

isop

(char ch)

double

getcalculate

(char op,

double x,

double y)

return ans;

}double

getnumber

(int

&end, string &s)

end++

;//恢復一下

reverse_

(num, size)

;return

atof

(num);}

void

reverse_

(char

* arr,

int size)

}private:}

;int

main()

字首 波蘭式 中綴 字尾表示式 逆波蘭式

中綴表示式 中綴表示式就是常見的運算表示式,如 3 4 5 6 字尾表示式 字尾表示式又稱逆波蘭表示式,與字首表示式相似,只是運算子位於運算元之後 比如 3 4 5 6 與字首表示式類似,只是順序是從左至右 從左至右掃瞄表示式,遇到數字時,將數字壓入堆疊,遇到運算子時,彈出棧頂的兩個數,用運算子對它...

逆波蘭式與表示式求解

逆波蘭式即字尾表示法 預處理 中序表示式 逆序表示式 infix to postfix 演算法 while 表示式非空 if 遇到運算元 直接輸出 else if 遇到操作符op op是 直接入棧s op是 s.push輸出,直到 op是四則運算,則 while 1 if s為空 s.top為 op...

逆波蘭式數學表示式求解

逆波蘭式數學表示式求解 輸入逆波蘭式表示式 include include using namespace std 函式表示式比較str1和str2優先順序 return 1表示str1優先順序高 return 0表示優先順序相等 return 1表示str2優先順序高 intcompare cha...