привет,ошибка есть в логике обработки дужок,но я не понял в чем именно, данний участок кода я виделил слешам,ошибка есть когда в примере есть скобка

#include <iostream>
#include <stack>
using namespace std;
class strategy{
public:
   virtual double DoOperations(double a,double b)=0;

};
class pluss: public strategy{
public:
double DoOperations(double a,double b)
{
return a+b;
}
};

class minuss: public strategy{
public:
 double DoOperations(double a,double b)
{
return a-b;
};
};
class dablepluss: public strategy{
public:
 double DoOperations(double a,double  b)
{
return a*b;
};
};


class del: public strategy{
public:
 double DoOperations(double  a,double  b)
{
return a/b;
};
};
class calcul{
strategy* strategia = NULL;
public:
double execute(double  a,double  b)
{if(strategia==NULL)
return 0;
return strategia->DoOperations(a,b);

}
void setStrat(strategy* strategia)
{
this->strategia = strategia;
}
};
 class Lecsema
{
public:
char type;
double num;

};
int getrang(char ch)
{if(ch=='+' && ch =='-' )


return 1;
 if(ch=='*' && ch =='/' )
return 2;

 return 0;



}
void Maths(stack<Lecsema>&numbers,stack<Lecsema>&znak,Lecsema item)
{
double a,b,c;
calcul cal;

switch (znak.top().type)
{
case '+':
a=numbers.top().num;
numbers.pop();
b=numbers.top().num;
numbers.pop();
cal.setStrat(new pluss());
c=cal.execute(a,b);
item.num=c;
item.type='0';
numbers.push(item);
znak.pop();

break;

case '-':
a=numbers.top().num;
numbers.pop();
b=numbers.top().num;
numbers.pop();
cal.setStrat(new minuss());
c=cal.execute(b,a);
item.num=c;
item.type='0';
numbers.push(item);
znak.pop();

break;

case '*':
a=numbers.top().num;
numbers.pop();
b=numbers.top().num;
numbers.pop();
cal.setStrat(new dablepluss());
c=cal.execute(b,a);
item.num=c;
item.type='0';
numbers.push(item);
znak.pop();

break;

case '/':
a=numbers.top().num;
numbers.pop();
b=numbers.top().num;
numbers.pop();
cal.setStrat(new del());
c=cal.execute(b,a);
item.num=c;
item.type='0';
numbers.push(item);
znak.pop();

break;

}

};

int main()
{
double num;
 char ch;
 stack<Lecsema>numbers;
 stack<Lecsema>znak;
 Lecsema item;
 while(1){
 ch=cin.peek();
 if(ch=='\n')
 {break;}
 if(ch>='0' && ch<='9' )
 {
 cin>>num;
 item.type='0';
 item.num=num;
 numbers.push(item);

 continue;
 }

 if(ch=='+'|| ch=='-' || ch=='*' || ch=='/')
 {if(znak.size() ==0 )
 {
  item.type=ch;
  item.num=0;
  znak.push(item);
  cin.ignore();
continue;
 }
  if(znak.size() !=0 && getrang(ch) > getrang(znak.top().type))
  {
  item.type=ch;
  item.num=0;
  znak.push(item);
  cin.ignore();
 continue;
  }
  if(znak.size() !=0 && getrang(ch) <= getrang(znak.top().type))
  {
Maths(numbers,znak,item);
continue;
  }
 }

/////////////////////

 if(ch=='(')
 {item.type=ch;
  item.num=0;
  znak.push(item);
  cin.ignore();
  continue;
  }
 if(ch==')')
 {while(znak.top().type != '(')
 {
 Maths(numbers,znak,item);
 }
 znak.pop();
 cin.ignore();
 continue;
 }

////////////////////////////

 }
while(znak.size() !=0 ){

 Maths(numbers,znak,item);
 }
 cout<<numbers.top().num;


    return 0;
}

Ответы (0 шт):