我用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,但我不知道如何在此代码中正确使用它。
答案 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
// ...
}