您好,登錄后才能下訂單哦!
使用C++代碼實現(xiàn)逆波蘭式的方法?針對這個問題,這篇文章詳細(xì)介紹了相對應(yīng)的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。
100行以內(nèi)C++代碼實現(xiàn)逆波蘭式
逆波蘭式(Reverse Polish notation,RPN,或逆波蘭記法),也叫后綴表達(dá)式(將運算符寫在操作數(shù)之后)。
算術(shù)表達(dá)式轉(zhuǎn)逆波蘭式例子:
逆波蘭式整體的算法流程圖如下:
下面給出我基于C++ 語言對逆波蘭式算法的實現(xiàn)代碼,值得注意的是:
1、算法中對操作數(shù),僅支持一個字符的字母或數(shù)字的操作數(shù),如:x,y,j,k,3,7等;如果要支持多個字符的操作數(shù),如:var1,3.14等。需要讀者自己擴展對算術(shù)表達(dá)式操作數(shù)的分詞部分的代碼。
2、為了為了增加轉(zhuǎn)換后的逆波蘭表達(dá)式的可讀性,我在每個操作數(shù)和操作符輸出時后面追加了一個空格。
代碼如下:
/// file: ReversePolishNotation.h #include <string> #include <stack> class ReversePolishNotation { private: std::string _expr; unsigned _idx; std::stack<std::string> _stk; public: ReversePolishNotation(const std::string &expr); std::string nextWord(); std::string operator()(); static int getOpPriority(const std::string &word); bool isWord(const std::string &word); bool isOperator(const std::string &word); };
/// file: ReversePolishNotation.cpp #include <iostream> #include <cassert> #include "ReversePolishNotation.h" #include <cctype> #include <sstream> using std::cout; using std::endl; ReversePolishNotation::ReversePolishNotation( const std::string &expr) : _idx(0), _expr(expr) {} std::string ReversePolishNotation::nextWord() { if (_idx >= _expr.length()) { return ""; } return _expr.substr(_idx++, 1); } std::string ReversePolishNotation::operator()() { std::stringstream outExpr; std::string word; std::string topElem; while (true) { word = nextWord(); if (isWord(word)) { outExpr << word << " "; } else if (isOperator(word)) { if (_stk.empty() || _stk.top() == "(") { _stk.push(word); continue; } topElem = _stk.top(); while (getOpPriority(topElem) > getOpPriority(word)) { outExpr << topElem << " "; _stk.pop(); if (_stk.empty()) { break; } topElem = _stk.top(); } _stk.push(word); } else if (word == "(") { _stk.push(word); } else if (word == ")") { while (true) { topElem = _stk.top(); _stk.pop(); if (topElem == "(") { break; } assert(!_stk.empty() && "[E]Expr error. Missing '('."); outExpr << topElem << " "; } } else if (word == "") { while (!_stk.empty()) { topElem = _stk.top(); assert (topElem != "(" && "[E]Expr error. Redundant '('."); outExpr << topElem << " "; _stk.pop(); } break; } else { assert(false && "[W]>>>Can not recognize this word"); } } return outExpr.str(); } int ReversePolishNotation::getOpPriority(const std::string &word) { if (word == "+") { return 1; } if (word == "-") { return 1; } if (word == "*") { return 2; } if (word == "/") { return 2; } return 0; } bool ReversePolishNotation::isWord(const std::string &word) { return isalpha(word.c_str()[0]) || isdigit(word.c_str()[0]); } bool ReversePolishNotation::isOperator(const std::string &word) { return word == "+" || word == "-" || word == "*" || word == "/"; } /// ---測試代碼--- int main() { assert(ReversePolishNotation("a+b*c")() == "a b c * + "); assert(ReversePolishNotation("(a+b)*c-(a+b)/e")() == "a b + c * a b + e / - "); assert(ReversePolishNotation("3*(2-(5+1))")() == "3 2 5 1 + - * "); // assert(ReversePolishNotation("3*((2-(5+1))")() == "3 2 5 1 + - * "); // Failed Case: Redundant '(' // assert(ReversePolishNotation("3*(?2-(5+1))")() == "3 2 5 1 + - * "); // Failed Case: Can not recognize '?' return 0; }
關(guān)于使用C++代碼實現(xiàn)逆波蘭式的方法問題的解答就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關(guān)注億速云行業(yè)資訊頻道了解更多相關(guān)知識。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。