c/c++语言开发共享C++代码实现逆波兰表达式

本文实例为大家分享了c++实现逆波兰表达式的具体代码,供大家参考,具体内容如下当我们输入一个数学表达式,是中缀表达式,我们首先转换为后缀表达式(逆波兰表达式),然后再进行求值。在《大话数据结构》的10

c/c++开发分享C++代码实现逆波兰表达式实例为大家分享了c++实现逆波兰表达式的具体代码,供大家参考,具体内容如下

当我们输入一个数学表达式,是中缀表达式,我们首先转换为后缀表达式(逆波兰表达式),然后再进行求值。

在《大话数据结构》的104-100页有详细的介绍,下面是我理解之后的代码实现。

代码思路:

(1)首先对输入的中缀表达式合法性进行判断,bool isstringlegal(const char* str); 函数实现。

(2)然后把中缀表达式转换为后缀表达式。

(3)根据后缀表达式求出结果,double gettheresult(vector<string> &vec);函数实现。

注意:表达式的运算符可以输入 加、减、乘、除、括号,输入的数据为整形数据,计算结果为double型数据。

  #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     /* 解析当前的整形数据,并把整形数据转换为string型 */  string analydata(const char* str, int &i);     /* 根据逆波兰表达式求表达式的值 */  double gettheresult(vector<string> &vec);     /* 判断该字符是否是 + - * / ( ) */  bool iscalchar(const char ch);     /* 判断输入的中缀表达式是否合法 */  bool isstringlegal(const char* str);           /* 解析当前的整形数据,并把整形数据转换为string型 */  string analydata(const char* str, int &i)  {    int temp = i++;    while(str[i] >= '0' && str[i] <= '9' && str[i] != '')    {      i++;    }       string s(str+temp,str+i);       return s;  }     /* 根据逆波兰表达式求表达式的值 */  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;  }  /* 判断输入的中缀表达式是否合法 */  bool isstringlegal(const char* str)  {    /* 判断是否是空串 */    if(null == str)    {      return false;    }       int len = strlen(str);    int i = 0;    int flag = 0;       /* 字符串的开头和末尾是否是数字 */    if(str[0] > '9' || str[0] < '0' || str[len-1] > '9' || str[len-1] < '0')    {      return false;    }          for(i = 0; str[i] != ''; i++)    {      /* 是否有除了加减乘除括号之外的字符 */      if(iscalchar(str[i]) == false)      {        return false;      }         /* 判断是否有两个连续的符号 */      if(i < len-1 && iscalchar(str[i]) == true)      {        if(iscalchar(str[i+1]) == true)        {          return false;        }         }         /* 判断括号是否成对 */      if(str[i] == '(')      {        flag++;      }      else if(str[i] == ')')      {        flag--;      }         /* 判断是否出现 )( 这样的情况 */      if(flag < 0)      {        return false;      }    }       /* 判断括号是否匹配 */    if(flag != 0)    {      return false;    }       return true;  }     int main(void)  {    char str[max_string_length] = {0};    int i = 0;    string data;       /* 存放运算符表达式的栈 */    stack<char> oper_char;       /* 存放后缀表达式 */    vector<string> post_str;       /* 输入中缀的表达式 */    gets(str);       /* 判断输入的中缀表达式是否合法 */    if(isstringlegal(str) != true)    {      cout << "this expression is not legal." << endl;    }    else    {      /* 将中缀表达式转换为后缀表达式 */      for(i = 0; str[i] != ''; i++)      {        /* 如果该字符为数字,解析该数字,并压入栈 */        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);          }             /*将当前的表达式符号入栈*/          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);            }          }             /*将当前的表达式符号入栈*/          oper_char.push(str[i]);        }      }         /* 存放表达式的栈可能还有数据 */      while(!oper_char.empty())      {        char chtemp[2] = {0};        chtemp[0] = oper_char.top();        oper_char.pop();           string strtemp(chtemp);        post_str.push_back(strtemp);      }         /* 把逆波兰表达式求值 */      cout << gettheresult(post_str) << endl;    }       return 0;  }

以上就是c/c++开发分享C++代码实现逆波兰表达式的全部内容,希望对大家的学习有所帮助,也希望大家多多支持<计算机技术网(www.ctvol.com)!!>。

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/c-cdevelopment/596973.html

(0)
上一篇 2021年5月8日
下一篇 2021年5月8日

精彩推荐