反向抛光符号C ++

时间:2015-08-19 13:37:46

标签: c++

我用C ++编写了这段代码,但问题是他只对一位数字有效,我想知道我可以更改或修改哪些内容对多位数字有效

#include <iostream> 
#include <stack> 
#include <string>
#include<vector>
#include<sstream>
using namespace std; 
bool op(char b) 
{
    return b=='+' || b=='-' || b=='*' || b=='/' ; 

} 

bool prio(char a, char b) 
{
    if(a=='(')
    {
        return true; 
    } 
    if(a=='+' || a=='-') 
    {
        return true; 

    } 
    if(b=='+' || b=='-') 
    {
        return false; 
    } 

    return true; 

} 
double posfix ( const std::string& expression )
{

    double l,r,ans;
    std::stringstream postfix(expression);
    std::vector<double> temp;
    std::string s;
    while ( postfix >> s )
    {
        if( op(s[0]) )
        {
            //Pull out top two elements
            r = temp.back();
            temp.pop_back();
            l = temp.back();
            temp.pop_back();
            // Perform the maths
            switch( s[0])
            {
                case '+': ans =  l + r ; break;
                case '-': ans =  l - r ; break;
                case '*': ans =  l * r ; break;
                case '/': ans =  l / r ; break; // check if r !=0
            }

            temp.push_back( ans ); // push the result of above operation
        }
        else
        {
            temp.push_back( std::stod(s) );
        }
    }

    return temp[0] ; //last element is the answer
} 
main() 
{

    string a;
    string res; 
    stack<char> s; 
    int i,j=0;
    double x;
    cin>>a; 
    for(i=0; i<a.size(); i++) 
    {
        if(a[i]!='(' && a[i]!=')' && op(a[i])==false) 
        {
            j++;
            if(j==1)
            {
                res=a[i]; 
            }
            else
            {
                res=res+" "+a[i]; 
            }
        } 
        if(a[i]=='(') 
        {
            s.push(a[i]) ; 
        } 
        if(a[i]==')') 
        {
            while(s.top()!='(') 
            {
                res=res+" "+s.top(); 
                s.pop();
            }
            s.pop(); 
        } 
        if(op(a[i])==true) 
        {
            if(s.empty() || (s.empty()==false && prio(s.top(), a[i])) ) 
            {
                s.push(a[i]); 
            }
            else 
            {
                while(s.empty()==false && prio(s.top(),a[i])==false ) 
                { 
                    res=res+" "+s.top(); 
                    s.pop(); 
                }
                s.push(a[i]) ; 
            }

        } 

    } 
    while(s.empty()==false) 
    {
        res=res+" "+s.top(); 
        s.pop(); 
    }         
    cout<<res<<endl;
    x=posfix(res); 
    cout<<endl<<x<<endl;
} 

我尝试使用strtod,但我不知道如何在此代码中正确使用它。

1 个答案:

答案 0 :(得分:0)

添加检查器以了解您是否正在阅读超过一个字符的数字。如果是这种情况,请勿在字符之间添加" "。解决方案的一个例子:

int k = 0;
for(i=0; i<a.size(); i++) {
    if(a[i]!='(' && a[i]!=')' && op(a[i])==false) {
        j++;
        k++;
        if(j==1)
            res=a[i];
        else if (k == 1)
            res=res+" "+a[i];
        else
            res=res+a[i];
    } else {
        k = 0;
    }
    // rest is the same
    // ...
}