C 逆波蘭演算法

2021-09-02 05:55:41 字數 2003 閱讀 1326

逆波蘭表示式又叫做字尾表示式。

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

逆波蘭是一種十分有用的表示式,它將複雜表示式轉換為可以依靠簡單的操作得到計算結果的表示式。例如(a+b)*(c+d)轉換為ab+cd+*。
它的優勢在於只用兩種簡單操作,入棧和出棧就可以搞定任何普通表示式的運算。

1.如何將乙個中序表示式轉換成逆波蘭表示式:

首先定義兩個棧:s1和s2。s1中儲存最終形成的逆波蘭表示式,s2將用於暫時存放運算子(在最終形成逆波蘭表示式的時候,清空該棧)。

下面詳細說明如何形成乙個逆波蘭表示式:

首先要明確各運算子之間的優先順序關係,然後從左到右遍歷乙個給定的中序表示式:

(1)如果遇到的是數字,將數字壓入s1中;

(2)如果遇到的是左括號,將左括號壓入s2中;

(3)如果遇到的是右括號,將s2中的運算子一直出棧壓入s1中,直到遇到左括號,但是該左括號出s2卻不入s1;

(4)如果遇到的是運算子,按照如下規則操作:

(1)如果s2為空,將運算子壓入s2中;

(2)如果s2不為空,當前遍歷到的運算子優先順序不小於s2棧頂運算子,將當前遍歷到的運算子壓入s2;

(3)如果s2不為空,當前遍歷到的運算子優先順序小於s2棧頂運算子,將棧頂運算子一直出棧壓入s1中,直到棧為空或遇到乙個運算子優先 級小於當前遍歷到的運算子,此時將當前遍歷到的運算子壓入s2;

(5)直到遍歷完整個中序表示式後,若s2中仍然存在運算子,將這些運算子依次出棧壓入s1,直到s2為空;

按照上面5條規則反覆操作,最終會在s1中形成需求的逆波蘭表示式。

2.利用逆波蘭表示式求值

首先定義乙個棧:s3,在該棧中存放最終表示式的值。從左到右遍歷s1,然後按照如下規則操作s3:

(1)如果遇到的是數字,將數字壓入s3中;

(2)如果遇到單目運算子(運算物件只有乙個的運算子,如:或(|)、與(&)等),取s3棧頂乙個元素進行單目運算,將結果再次壓入s3中;

(3)如果遇到雙目運算子(運算物件有兩個的運算子,如:加(+)、賦值(=)等),取s3棧頂兩個元素(先出棧的在右,後出棧的在左)進行 雙目運算,將結果再次壓入s3中;

原文:下面是根據這個寫的演算法:

#include #include #include #include using namespace std;

//using std::string;

int priority(char c) //優先順序

}string printstack(stackstr)

return result;

}string polish(string str) //逆波蘭表示式

else if(curchar=='(') //如果遇到的是左括號,將左括號壓入s2中

else if(!s2.empty() &&curchar==')') //如果遇到的是右括號,將s2中的運算子一直出棧壓入s1中,直到遇到左括號,但是該左括號出s2卻不入s1;

s2.pop();

}else //如果遇到的是運算子,按照如下規則操作

else

break;

}s2.push(curchar);}}

else}}

while(!s2.empty()) //直到遍歷完整個中序表示式後,若s2中仍然存在運算子,將這些運算子依次出棧壓入s1,直到s2為空;

return printstack(s1);

}int cal(string s1) //計算值

{ stacks3;

for(int i=0;i>str;

string result=polish(str);

cout《逆波蘭表示式是正確的,但是計算的值我在codeblocks執行是錯誤的,但是我在牛客網的執行是正確的,不知道怎麼回事。

逆波蘭演算法

中綴表示式轉字尾表示式 棧實現1.從左到右掃瞄字串 2.如果遇到數字,就輸出 3.如果遇到運算子,1 棧空時,直接入棧 2 棧非空時,與棧頂元素進行優先順序比較,如果運算子優先順序大,入棧,反之,則彈出優先順序小的棧頂元素 並輸出 直到運算子符合入棧條件,入棧int judge char ch st...

逆波蘭式演算法

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

C 實現逆波蘭式

a b c的逆波蘭式為ab c,假設計算機把ab c按從左到右的順序壓入棧中,並且按照遇到運算子就把棧頂兩個元素出棧,執行運算,得到的結果再入棧的原則來進行處理,那麼ab c的執行結果如下nkqnqmthw 1 a入棧 0位置 2 b入棧 1位置 3 遇到運算子 將a和b出棧,執行a b的操作,得到...