代码改变世界

四则运算

2016-03-12 19:05  真白新宇  阅读(312)  评论(0编辑  收藏  举报

string InfixToPostfix(std::string infix)  

{  char current = 0;//读入的字符  

    std::string postfix;//写入后缀表达式的字符串  

    SqStack<char> mark;//符号入栈  

     InitStack(&mark);  

    std::map<char,int> priority;//运算符号优先级表  

    priority['+'] = 0;  

    priority['-'] = 0;  

    priority['*'] = 1;  

    priority['/'] = 1;

    for(int i = 0;i<infix.length();++i)//逐个读取中缀表达式字符串中的字符  

    {  

        current =infix[i];

        switch(current)  

        {  case '0':case '1':case '2':case '3':case '4':case '5':  case '6':case '7':case '8':case '9':case '.':  

            postfix.push_back(current);//如果是数字的话直接写入输出字符串。

             break;  

                  case '+':case '-':case '*':case '/':  if(infix[i-1] != ')') postfix.push_back(';');//如果运算符的前一项不是右括号即说明前一个数字输入完毕,用;标识前面几个字符组成一个数字。

            if(!IsEmpty(mark))//如果符号栈非空,即比较目前符号与栈顶符号优先级,低于等于出栈,并写入输出字符串。  

                {  char tempTop;  

                    GetTop(mark,tempTop);  

                     while(tempTop != '(' && priority[current]<=priority[tempTop])  

                    {  char tempOut;  

                        Pop(&mark,&tempOut);  

                        postfix.push_back(tempOut);

                        if(IsEmpty(mark))//如果栈为空,跳出while循环  break;  

                        GetTop(mark,tempTop);  

                    }  

                }  

                Push(&mark,current);//符号全部出栈或者遇到了'('或者大于栈顶符号的优先级,将新符号压入栈中。  break;  case '(':  

                Push(&mark,current);//左括号直接入栈  break;  case ')':  

                postfix.push_back(';');//右括号说明前方数字输入完成,标识一下。

                char tempTop;  

                GetTop(mark,tempTop);

                 while(tempTop !='(')//直到栈顶元素是左括号才停止循环

                 {  char tempOut;  Pop(&mark,&tempOut);   

                postfix.push_back(tempOut);//出栈并写入输出字符串中。

                     GetTop(mark,tempTop);   

              }  

           char tempOut;     

           Pop(&mark,&tempOut);//直接将左括号出栈。

 break;

 default:

 break;//忽略其他字符。     

    }      }

 if(infix[infix.size()-1] != ')') postfix.push_back(';');//中缀表达式最后一个是数字需要加上;标识其是一个数字的结束,便于计算时统一识别数字结束。  while(!IsEmpty(mark))//如果栈非空,全部出栈并写入输出字符串。

     {  char tempOut;

         Pop(&mark,&tempOut);

        postfix.push_back(tempOut);

     }

 return postfix;//返回后缀表达式。

 }  

然后计算后缀表达式:

[cpp] view plain copy
 
  1. ///计算后缀表达式结果  
  2. //输入为后缀表达式s,逐个读取字符,如果是数字即放入存放当前数字的字符串中,遇到“;”即将此字符串转换为float,  
  3. //使用std::atof(),参数接受const char*类型,字符串需使用.c_str()转化。  
  4. //完成数字识别转化后入栈,遇到符号即取出栈顶的两个数字计算,结果入栈。  
  5. //栈中最后的元素即为结果。  
  6. float Compute(std::string s)  
  7. {  
  8.     SqStack<float> waitForCompute;  
  9.     SqStack<float>* ptWait = &waitForCompute;  
  10.     InitStack<float>(ptWait);         //使用栈记录等待计算的数  
  11.   
  12.     std::string strNum;  
  13.     float currNum = 0;  
  14.   
  15.     float temNum1 = 0;  
  16.     float temNum2 = 0;  
  17.     for(std::string::const_iterator i = s.begin();i<s.end();++i)  
  18.     {  
  19.         switch(*i)  
  20.         {  
  21.         case '0':case '1':case '2':case '3':case '4':case '5':  
  22.         case '6':case '7':case '8':case '9':case '.':  
  23.             strNum.push_back(*i);  
  24.             break;  
  25.         case '+':  
  26.             Pop(ptWait,&temNum1);  
  27.             Pop(ptWait,&temNum2);  
  28.             Push(ptWait, temNum2 + temNum1);  
  29.             break;  
  30.         case '-':  
  31.             Pop(ptWait,&temNum1);  
  32.             Pop(ptWait,&temNum2);  
  33.             Push(ptWait, temNum2 - temNum1);  
  34.             break;  
  35.         case '*':  
  36.             Pop(ptWait,&temNum1);  
  37.             Pop(ptWait,&temNum2);  
  38.             Push(ptWait, temNum2 * temNum1);  
  39.             break;  
  40.         case '/':  
  41.             Pop(ptWait,&temNum1);  
  42.             Pop(ptWait,&temNum2);  
  43.             Push(ptWait, temNum2 / temNum1);  
  44.             break;  
  45.         case ';':  
  46.             currNum = std::atof(strNum.c_str());//字符串转换为浮点型。  
  47.             strNum.clear();  
  48.             Push(ptWait,currNum);  
  49.             break;  
  50.         }  
  51.     }  
  52.     Pop(ptWait,&currNum);  
  53.     return currNum;  
  54.