c语言int 转bool_C++代码实现逆波兰式_C 语言
生活随笔
收集整理的這篇文章主要介紹了
c语言int 转bool_C++代码实现逆波兰式_C 语言
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
100行以內C++代碼實現逆波蘭式
逆波蘭式(Reverse Polish notation,RPN,或逆波蘭記法),也叫后綴表達式(將運算符寫在操作數之后)。
算術表達式轉逆波蘭式例子:
逆波蘭式整體的算法流程圖如下:
下面給出我基于C++ 語言對逆波蘭式算法的實現代碼,值得注意的是:
1、算法中對操作數,僅支持一個字符的字母或數字的操作數,如:x,y,j,k,3,7等;如果要支持多個字符的操作數,如:var1,等。需要讀者自己擴展對算術表達式操作數的分詞部分的代碼。
2、為了為了增加轉換后的逆波蘭表達式的可讀性,我在每個操作數和操作符輸出時后面追加了一個空格。
代碼如下:
/// file: #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 "" #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 >= ()) {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 (() || () == "(") {(word);continue;}topElem = ();while (getOpPriority(topElem) > getOpPriority(word)) {outExpr << topElem << " ";();if (()) {break;}topElem = ();}(word);} else if (word == "(") {(word);} else if (word == ")") {while (true) {topElem = ();();if (topElem == "(") {break;}assert(!() && "[E]Expr error. Missing '('.");outExpr << topElem << " ";}} else if (word == "") {while (!()) {topElem = ();assert (topElem != "(" && "[E]Expr error. Redundant '('.");outExpr << topElem << " ";();}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(()[0]) || isdigit(()[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; }以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
總結
以上是生活随笔為你收集整理的c语言int 转bool_C++代码实现逆波兰式_C 语言的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: fpu测试_I510400性能及温度测试
- 下一篇: 圣骑穿什么、用什么武器