欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C++代碼實現(xiàn)逆波蘭式

 更新時間:2020年11月01日 10:18:23   作者:ronnie88597  
這篇文章主要為大家詳細介紹了C++代碼實現(xiàn)逆波蘭式,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下

100行以內(nèi)C++代碼實現(xiàn)逆波蘭式

逆波蘭式(Reverse Polish notation,RPN,或逆波蘭記法),也叫后綴表達式(將運算符寫在操作數(shù)之后)。

算術表達式轉逆波蘭式例子:

逆波蘭式整體的算法流程圖如下:

下面給出我基于C++ 語言對逆波蘭式算法的實現(xiàn)代碼,值得注意的是:

1、算法中對操作數(shù),僅支持一個字符的字母或數(shù)字的操作數(shù),如:x,y,j,k,3,7等;如果要支持多個字符的操作數(shù),如:var1,3.14等。需要讀者自己擴展對算術表達式操作數(shù)的分詞部分的代碼。

2、為了為了增加轉換后的逆波蘭表達式的可讀性,我在每個操作數(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;
}

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • C++派生訪問說明符小記(推薦)

    C++派生訪問說明符小記(推薦)

    下面小編就為大家?guī)硪黄狢++派生訪問說明符小記(推薦)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-01-01
  • 使用C++實現(xiàn)簡單的文章生成器

    使用C++實現(xiàn)簡單的文章生成器

    這篇文章主要為大家詳細介紹了鵝湖使用C++實現(xiàn)簡單的狗屁不通文章生成器,文中的示例代碼講解詳細,具有一定的借鑒價值,有需要的小伙伴可以了解下
    2024-03-03
  • C語言模擬實現(xiàn)密碼輸入的示例代碼

    C語言模擬實現(xiàn)密碼輸入的示例代碼

    本文主要介紹了C語言模擬實現(xiàn)密碼輸入的示例代碼,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • C++生成格式化的標準字符串實例代碼

    C++生成格式化的標準字符串實例代碼

    這篇文章主要給大家介紹了關于C++生成格式化的標準字符串的相關資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用C++具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2019-09-09
  • C++實現(xiàn)圖書管理系統(tǒng)源碼

    C++實現(xiàn)圖書管理系統(tǒng)源碼

    這篇文章主要為大家詳細介紹了C++實現(xiàn)圖書管理系統(tǒng)源碼,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • 詳解C++中new運算符和delete運算符的使用

    詳解C++中new運算符和delete運算符的使用

    這篇文章主要介紹了C++中new運算符和delete運算符的使用,文章來自于微軟開發(fā)者文檔,因而根據(jù)Visual C++的一些特性來進行講解,需要的朋友可以參考下
    2016-01-01
  • C語言實現(xiàn)紅黑樹詳細步驟+代碼

    C語言實現(xiàn)紅黑樹詳細步驟+代碼

    大家好,本篇文章主要講的是C語言實現(xiàn)紅黑樹詳細步驟+代碼,感興趣的同學趕快來看一看吧,對你有幫助的話記得收藏一下
    2022-01-01
  • C++標準庫中sstream與strstream的區(qū)別詳細解析

    C++標準庫中sstream與strstream的區(qū)別詳細解析

    以下是對C++標準庫中sstream與strstream的區(qū)別進行了詳細的分析介紹,需要的朋友可以過來參考下
    2013-09-09
  • QT實現(xiàn)多線程兩種方式案例詳解

    QT實現(xiàn)多線程兩種方式案例詳解

    這篇文章主要介紹了QT實現(xiàn)多線程兩種方式案例詳解,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • C++關于/2和>>1的區(qū)別說明

    C++關于/2和>>1的區(qū)別說明

    這篇文章主要介紹了C++關于/2和>>1的區(qū)別說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-07-07

最新評論