中綴表示式轉字尾表示式
棧實現
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 的形式,計算機判斷起來會顯得格外的快...