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

C++代碼實(shí)現(xiàn)逆波蘭表達(dá)式

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

本文實(shí)例為大家分享了C++實(shí)現(xiàn)逆波蘭表達(dá)式的具體代碼,供大家參考,具體內(nèi)容如下

當(dāng)我們輸入一個(gè)數(shù)學(xué)表達(dá)式,是中綴表達(dá)式,我們首先轉(zhuǎn)換為后綴表達(dá)式(逆波蘭表達(dá)式),然后再進(jìn)行求值。

在《大話數(shù)據(jù)結(jié)構(gòu)》的104-100頁有詳細(xì)的介紹,下面是我理解之后的代碼實(shí)現(xiàn)。

代碼思路:

(1)首先對(duì)輸入的中綴表達(dá)式合法性進(jìn)行判斷,bool isStringLegal(const char* str); 函數(shù)實(shí)現(xiàn)。

(2)然后把中綴表達(dá)式轉(zhuǎn)換為后綴表達(dá)式。

(3)根據(jù)后綴表達(dá)式求出結(jié)果,double getTheResult(vector<string> &vec);函數(shù)實(shí)現(xiàn)。

注意:表達(dá)式的運(yùn)算符可以輸入 加、減、乘、除、括號(hào),輸入的數(shù)據(jù)為整形數(shù)據(jù),計(jì)算結(jié)果為double型數(shù)據(jù)。

#include <iostream>
#include <math.h>
#include <map>
#include <vector>
#include <string.h>
#include <memory>
#include <string>
#include <stdio.h>
#include <stack>
#include <stdlib.h>
 
using namespace std;
 
#define MAX_STRING_LENGTH 100
 
/* 解析當(dāng)前的整形數(shù)據(jù),并把整形數(shù)據(jù)轉(zhuǎn)換為string型 */
string analyData(const char* str, int &i);
 
/* 根據(jù)逆波蘭表達(dá)式求表達(dá)式的值 */
double getTheResult(vector<string> &vec);
 
/* 判斷該字符是否是 + - * / ( ) */
bool isCalChar(const char ch);
 
/* 判斷輸入的中綴表達(dá)式是否合法 */
bool isStringLegal(const char* str);
 
 
 
/* 解析當(dāng)前的整形數(shù)據(jù),并把整形數(shù)據(jù)轉(zhuǎn)換為string型 */
string analyData(const char* str, int &i)
{
  int temp = i++;
  while(str[i] >= '0' && str[i] <= '9' && str[i] != '\0')
  {
    i++;
  }
 
  string s(str+temp,str+i);
 
  return s;
}
 
/* 根據(jù)逆波蘭表達(dá)式求表達(dá)式的值 */
double getTheResult(vector<string> &vec)
{
  vector<string>::iterator it;
  stack<double> sta;
 
  string strTemp;
  double d = 0, d1 = 0, d2 = 0;
 
  for(it = vec.begin(); it != vec.end(); it++)
  {
    strTemp = (*it);
 
    if(strTemp == "+")
    {
      d1 = sta.top();
      sta.pop();
 
      d2 = sta.top();
      sta.pop();
 
      d = d1 + d2;
      sta.push(d);
    }
    else if(strTemp == "-")
    {
      d1 = sta.top();
      sta.pop();
 
      d2 = sta.top();
      sta.pop();
 
      d = d2 - d1;
      sta.push(d);
    }
    else if(strTemp == "*")
    {
      d1 = sta.top();
      sta.pop();
 
      d2 = sta.top();
      sta.pop();
 
      d = d2 * d1;
      sta.push(d);
    }
    else if(strTemp == "/")
    {
      d1 = sta.top();
      sta.pop();
 
      d2 = sta.top();
      sta.pop();
 
      d = d2 / d1;
      sta.push(d);
    }
    else
    {
      const char *p = strTemp.c_str();
      d = atoi(p);
      sta.push(d);
    }
  }
  return sta.top();
}
 
/* 判斷該字符是否是 + - * / ( ) */
bool isCalChar(const char ch)
{
  if(ch == '+' || ch == '-' || ch == '*' || ch == '/' || ch == '(' || ch == ')')
  {
    return true;
  }
 
  return false;
}
/* 判斷輸入的中綴表達(dá)式是否合法 */
bool isStringLegal(const char* str)
{
  /* 判斷是否是空串 */
  if(NULL == str)
  {
    return false;
  }
 
  int len = strlen(str);
  int i = 0;
  int flag = 0;
 
  /* 字符串的開頭和末尾是否是數(shù)字 */
  if(str[0] > '9' || str[0] < '0' || str[len-1] > '9' || str[len-1] < '0')
  {
    return false;
  }
 
 
  for(i = 0; str[i] != '\0'; i++)
  {
    /* 是否有除了加減乘除括號(hào)之外的字符 */
    if(isCalChar(str[i]) == false)
    {
      return false;
    }
 
    /* 判斷是否有兩個(gè)連續(xù)的符號(hào) */
    if(i < len-1 && isCalChar(str[i]) == true)
    {
      if(isCalChar(str[i+1]) == true)
      {
        return false;
      }
 
    }
 
    /* 判斷括號(hào)是否成對(duì) */
    if(str[i] == '(')
    {
      flag++;
    }
    else if(str[i] == ')')
    {
      flag--;
    }
 
    /* 判斷是否出現(xiàn) )( 這樣的情況 */
    if(flag < 0)
    {
      return false;
    }
  }
 
  /* 判斷括號(hào)是否匹配 */
  if(flag != 0)
  {
    return false;
  }
 
  return true;
}
 
int main(void)
{
  char str[MAX_STRING_LENGTH] = {0};
  int i = 0;
  string data;
 
  /* 存放運(yùn)算符表達(dá)式的棧 */
  stack<char> oper_char;
 
  /* 存放后綴表達(dá)式 */
  vector<string> post_str;
 
  /* 輸入中綴的表達(dá)式 */
  gets(str);
 
  /* 判斷輸入的中綴表達(dá)式是否合法 */
  if(isStringLegal(str) != true)
  {
    cout << "This expression is not legal." << endl;
  }
  else
  {
    /* 將中綴表達(dá)式轉(zhuǎn)換為后綴表達(dá)式 */
    for(i = 0; str[i] != '\0'; i++)
    {
      /* 如果該字符為數(shù)字,解析該數(shù)字,并壓入棧 */
      if(str[i] >= '0' && str[i] <= '9')
      {
        data = analyData(str,i);
        post_str.push_back(data);
        i--;
      }
      else if(str[i] == '(')
      {
        oper_char.push(str[i]);
      }
      else if(str[i] == ')')
      {
        char chtemp[2] = {0};
 
        chtemp[0] = oper_char.top();
 
        while(chtemp[0] != '(')
        {
          string strtemp(chtemp);
          post_str.push_back(strtemp);
          oper_char.pop();
 
          chtemp[0] = oper_char.top();
        }
        oper_char.pop();
      }
      else if(str[i] == '+' || str[i] == '-')
      {
        char chtemp[2] = {0};
 
        /* 全部出棧,但是碰到 '('就要停止出棧 */
        while(oper_char.size() != 0)
        {
          chtemp[0] = oper_char.top();
          if(chtemp[0] == '(')
          {
            break;
          }
 
          oper_char.pop();
 
          string strtemp(chtemp);
          post_str.push_back(strtemp);
        }
 
        /*將當(dāng)前的表達(dá)式符號(hào)入棧*/
        oper_char.push(str[i]);
      }
      else if(str[i] == '*' || str[i] == '/')
      {
        char chtemp[2] = {0};
        while(oper_char.size() != 0)
        {
          chtemp[0] = oper_char.top();
          if(chtemp[0] == '(' || chtemp[0] == '+' || chtemp[0] == '-')
          {
            break;
          }
          else
          {
            oper_char.pop();
 
            string strtemp(chtemp);
            post_str.push_back(strtemp);
          }
        }
 
        /*將當(dāng)前的表達(dá)式符號(hào)入棧*/
        oper_char.push(str[i]);
      }
    }
 
    /* 存放表達(dá)式的棧可能還有數(shù)據(jù) */
    while(!oper_char.empty())
    {
      char chtemp[2] = {0};
      chtemp[0] = oper_char.top();
      oper_char.pop();
 
      string strtemp(chtemp);
      post_str.push_back(strtemp);
    }
 
    /* 把逆波蘭表達(dá)式求值 */
    cout << getTheResult(post_str) << endl;
  }
 
  return 0;
}

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • C++解析Json的方法詳解【jsoncpp】

    C++解析Json的方法詳解【jsoncpp】

    這篇文章主要介紹了C++解析Json的方法,結(jié)合實(shí)例形式分析了C++操作json格式數(shù)據(jù)的相關(guān)實(shí)現(xiàn)技巧與注意事項(xiàng),需要的朋友可以參考下
    2017-06-06
  • C++中的運(yùn)算符和運(yùn)算符優(yōu)先級(jí)總結(jié)

    C++中的運(yùn)算符和運(yùn)算符優(yōu)先級(jí)總結(jié)

    這篇文章主要介紹了C++中的運(yùn)算符和運(yùn)算符優(yōu)先級(jí)總結(jié),主要整理了算術(shù)、關(guān)系、邏輯、位和賦值運(yùn)算符的用法,需要的朋友可以參考下
    2016-05-05
  • C++實(shí)現(xiàn)職工管理系統(tǒng)

    C++實(shí)現(xiàn)職工管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)職工管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-05-05
  • C/C++中CONST用法總結(jié)(推薦)

    C/C++中CONST用法總結(jié)(推薦)

    這篇文章主要介紹了C/C++中CONST用法總結(jié)(推薦),包括const常量與define宏定義的區(qū)別介紹,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友參考下吧
    2017-07-07
  • EasyX實(shí)現(xiàn)自由落體小球

    EasyX實(shí)現(xiàn)自由落體小球

    這篇文章主要為大家詳細(xì)介紹了EasyX實(shí)現(xiàn)自由落體小球,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • Qt計(jì)時(shí)器使用方法詳解

    Qt計(jì)時(shí)器使用方法詳解

    這篇文章為大家詳細(xì)主要介紹了Qt計(jì)時(shí)器的使用方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • C++ vector在多線程操作中出現(xiàn)內(nèi)存錯(cuò)誤問題及解決

    C++ vector在多線程操作中出現(xiàn)內(nèi)存錯(cuò)誤問題及解決

    這篇文章主要介紹了C++ vector在多線程操作中出現(xiàn)內(nèi)存錯(cuò)誤問題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • C語言聯(lián)合體Union特點(diǎn)及運(yùn)用全面講解教程

    C語言聯(lián)合體Union特點(diǎn)及運(yùn)用全面講解教程

    這篇文章主要為大家介紹了C語言聯(lián)合體Union特點(diǎn)及運(yùn)用的全面講解教程有需要深度朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪
    2021-10-10
  • QT實(shí)現(xiàn)秒表項(xiàng)目

    QT實(shí)現(xiàn)秒表項(xiàng)目

    這篇文章主要為大家詳細(xì)介紹了QT實(shí)現(xiàn)秒表項(xiàng)目,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • C++之談?wù)剺?gòu)造函數(shù)的初始化列表

    C++之談?wù)剺?gòu)造函數(shù)的初始化列表

    構(gòu)造函數(shù)主要作用在于創(chuàng)建對(duì)象時(shí)為對(duì)象的成員屬性賦值,構(gòu)造函數(shù)由編譯器自動(dòng)調(diào)用,無須手動(dòng)調(diào)用,這篇文章詳細(xì)介紹了構(gòu)造函數(shù)的初始化列表,文章中有詳細(xì)的示例代碼,感興趣的同學(xué)可以參考閱讀
    2023-04-04

最新評(píng)論

泉州市| 宾川县| 房山区| 霍邱县| 资源县| 卫辉市| 祁门县| 通化市| 彰化县| 保定市| 江口县| 淮安市| 循化| 东丰县| 临泽县| 东源县| 日照市| 瓦房店市| 高碑店市| 延安市| 防城港市| 深泽县| 确山县| 同德县| 宣汉县| 芷江| 太仓市| 新丰县| 日土县| 和龙市| 湖南省| 通江县| 吴忠市| 屏东县| 峨山| 阿鲁科尔沁旗| 宁强县| 五台县| 浮山县| 临澧县| 桓台县|