最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

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

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

算術表達式轉(zhuǎn)逆波蘭式例子:

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

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

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

2、為了為了增加轉(zhuǎn)換后的逆波蘭表達式的可讀性,我在每個操作數(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)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • QT實現(xiàn)QML側邊導航欄的最簡方法

    QT實現(xiàn)QML側邊導航欄的最簡方法

    本文主要介紹了QT實現(xiàn)QML側邊導航欄的最簡方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-06-06
  • C++ explicit關鍵字的應用方法詳細講解

    C++ explicit關鍵字的應用方法詳細講解

    C++ explicit關鍵字用來修飾類的構造函數(shù),表明該構造函數(shù)是顯式的,既然有"顯式"那么必然就有"隱式",那么什么是顯示而什么又是隱式的呢?下面就讓我們一起來看看這方面的知識吧
    2013-09-09
  • C語言實現(xiàn)文件讀寫功能流程

    C語言實現(xiàn)文件讀寫功能流程

    這篇文章主要介紹了C語言實現(xiàn)文件讀寫,文件是一段數(shù)據(jù)的集合,這些數(shù)據(jù)可以是有規(guī)則的,也可以是無序的集合。在stdio.h有一個非常重要的東西,文件指針,每個文件都會在內(nèi)存中開辟一塊空間,用于存放文件的相關信息
    2022-12-12
  • C語言實例講解四大循環(huán)語句的使用

    C語言實例講解四大循環(huán)語句的使用

    C語言有四大循環(huán)語句,他們之間可以進行任意轉(zhuǎn)換。本文將首先對其語法進行講解,然后通過一個實例用四種循環(huán)來實現(xiàn)。相信通過本文的學習,大家都能夠?qū)語言循環(huán)語句有著熟練的掌握
    2022-05-05
  • C++的友元和內(nèi)部類你了解嗎

    C++的友元和內(nèi)部類你了解嗎

    這篇文章主要為大家介紹了C++的友元和內(nèi)部類,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-01-01
  • C語言中結構體實例解析

    C語言中結構體實例解析

    大家好,本篇文章主要講的是C語言中結構體實例解析,感興趣的同學趕快來看一看吧,對你有幫助的話記得收藏一下
    2022-02-02
  • 詳解C++中vector的理解以及模擬實現(xiàn)

    詳解C++中vector的理解以及模擬實現(xiàn)

    vector是表示可變大小數(shù)組的序列容器。這篇文章主要為大家詳細介紹了vector的理解以及模擬實現(xiàn),文中的示例代碼講解詳細,感興趣的可以了解一下
    2023-03-03
  • 淺談C++模板元編程

    淺談C++模板元編程

    本篇文章主要介紹了淺談C++模板元編程,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-12-12
  • C++中String類的常用接口函數(shù)總結

    C++中String類的常用接口函數(shù)總結

    這篇文章主要介紹了C++中Stirng類的常用接口函數(shù),文中有詳細的代碼示例供大家參考,對我們學習C++有一定的幫助,感興趣的同學可以跟著小編一起來學習
    2023-06-06
  • 深入理解c語言數(shù)組

    深入理解c語言數(shù)組

    這篇文章主要介紹了c語言數(shù)組,有需要的朋友可以參考一下
    2013-12-12

最新評論

洪泽县| 嘉鱼县| 莱西市| 咸阳市| 南岸区| 商南县| 虎林市| 原阳县| 辉县市| 濮阳市| 泌阳县| 东丰县| 界首市| 济南市| 辽宁省| 任丘市| 常山县| 吴旗县| 新泰市| 巴林左旗| 尼勒克县| 北碚区| 阿荣旗| 类乌齐县| 县级市| 新化县| 商都县| 长宁县| 寿光市| 盐山县| 仪征市| 九龙县| 杂多县| 山东省| 茂名市| 思南县| 宝清县| 乐昌市| 泸州市| 循化| 偃师市|