逆波蘭演算法

2021-10-06 19:03:04 字數 3529 閱讀 5535

中綴表示式轉字尾表示式

棧實現

1.從左到右掃瞄字串

2.如果遇到數字,就輸出

3.如果遇到運算子,

(1)棧空時,直接入棧

(2)棧非空時,與棧頂元素進行優先順序比較,如果運算子優先順序大,入棧,

反之,則彈出優先順序小的棧頂元素(並輸出)直到運算子符合入棧條件,入棧

int

judge

(char ch)

string trans

(string str)

else

if(str[i]

==')'

) mid.

pop();

//左括號出棧

i++;}

elseif(

isdigit

(str[i]))

s +=' ';}

else

if(str[i]

=='+'

||str[i]

=='-'

||str[i]

=='*'

||str[i]

=='/'

) mid.

push

(str[i]);

//當前運算子進棧

i++;}

}while

(!mid.

empty()

)return s;

}

括號法

1.首先按照優先順序給表示式加上括號:((a+(b*c))+((((d*e)+f)*g))

2.把運算符號移動到對應的括號後面:((a(bc)*)+((((de)*f)+g)*)+

3.去掉括號:abc*

+de*f+g*

+

字尾表示式求值

void

evaluate

(string s)

a[i]

='\0'

; num =

atof

(a);

//atof()不支援string型,支援char型

ans.

push

(num)

;//數字進棧

}else

}printf

("%.2lf\n"

, ans.

top())

;//printf("%d\n", (int)ans.top());

}

逆波蘭演算法模板

/**

樣例輸入

21.000+2/4=

((1+2)*5+1)/4=

樣例輸出

1.50

4.00

*/#include

using

namespace std;

intjudge

(char ch)

int main (

)else

if( str[i]

==')'

)//遇右括號則將左括號及左括號以上識別符號出棧

mid.

pop();

i++;}

elseif(

isdigit

(str[i]))

//數字或小數點則直接轉入字尾表示式

s +=' ';}

else

if(str[i]

=='+'

||str[i]

=='-'

||str[i]

=='*'

||str[i]

=='/'

) mid.

push

(str[i]);

//將當前運算子進棧

i++;}

}while

(!mid.

empty()

)//將最後剩餘運算子出棧

string temp;

stringstream ss

(s);

char a[

1000];

double num;

while

(ss >> temp)

//string->char

/*ss.clear();//如果你想通過使用同一stringstream物件實現多種型別的轉換,請注意在每一次轉換之後都必須呼叫

*/else

} cout<< fixed <<

setprecision(2

)

)

//

例題:

注意:運算子優先順序相同

逆波蘭法:(注:也可以從左到右直接算)

#include

using

namespace std;

intjudge

(char ch)

string trans

(string str)

else

if(str[i]

==')'

) mid.

pop();

//左括號出棧

i++;}

elseif(

isdigit

(str[i]))

s +=' ';}

else

if(str[i]

=='+'

||str[i]

=='-'

||str[i]

=='*'

||str[i]

=='/'

) mid.

push

(str[i]);

//當前運算子進棧

i++;}

}while

(!mid.

empty()

)return s;

}void

evaluate

(string s)

a[i]

='\0'

; num =

atof

(a);

//atof()不支援string型,支援char型

ans.

push

(num)

;//數字進棧

}else

num = y / x;

} ans.

push

(num);}

}printf

("%d\n",(

int)ans.

top())

;}bool

check

(string str)

else

}return

true;}

intmain()

else

}

C 逆波蘭演算法

逆波蘭表示式又叫做字尾表示式。在通常的表示式中,二元運算子總是置於與之相關的兩個運算物件之間,這種表示法也稱為中綴表示。波蘭邏輯學家j.lukasiewicz於1929年提出了另一種表示表示式的方法,按此方法,每一運算子都置於其運算物件之後,故稱為字尾表示式。逆波蘭是一種十分有用的表示式,它將複雜表...

逆波蘭式演算法

1 從左至右掃瞄一中綴表示式。2 若讀取的是運算元,則判斷該運算元的型別,並將該運算元存入運算元堆疊 3 若讀取的是運算子 1 該運算子為左括號 則直接存入運算子堆疊。2 該運算子為右括號 則輸出運算子堆疊中的運算子到運算元堆疊,直到遇到左括號為止,此時拋棄該左括號。3 該運算子為非括號運算子 a ...

利用棧實現逆波蘭演算法

1.逆波蘭表示式?在我們的普遍認知中,計算的優先順序總是和 相關,形如 1 2 3 4 這樣的式子,我們看起來十分的清晰明了,但對計算機來說,它會進行很多次的判斷來確定乙個運算的優先順序。於是在很久很久之前就有乙個人發現,如果我們將上述算式寫成形如1 2 3 4 的形式,計算機判斷起來會顯得格外的快...