Witam
Piszę kalkulator w C++ mam już zapisany algorytm, który zamienia wyrażenie do ONP; ale niestety działa tylko na pojedynczych cyfrach.To znaczy, że takie wyrażenie 5+8*(4+2) obliczy natomiast z takim 50+80*(4+21) już sobie nie radzi tak samo jak i z liczbami ujemnymi i zmiennoprzecinkowymi.Jeśli był by ktoś w stanie mi pomóc będę bardzo wdzięczny.
A oto kod.
#include "Odwrotna_Notacja_Polska.h"
#include <iostream>
#include<list>
#include<stack>
void Odwrotna_Notacja_Polska::zapamietaj(char * napis)
{
strcpy_s(wyrazenie ,napis);
}
void Odwrotna_Notacja_Polska::oblicz(){
std::list <char> lista1;
std::stack<char> stos1;
std::stack<float> stos2;
char x;
float d;
for (int i=0;wyrazenie[i]!=NULL;i++)
{
if(wyrazenie[i] >= '0' && wyrazenie[i] <= '9')
{
x=wyrazenie[i];
lista1.push_front(x);
}
else if(wyrazenie[i]=='+'||wyrazenie[i]=='*'||wyrazenie[i]=='/'||wyrazenie[i]=='-')
{
x=wyrazenie[i];
stos1.push(x);
}
else if(wyrazenie[i]==')')
{
x=stos1.top();
lista1.push_front(x);
stos1.pop();
}
}
if(stos1.empty())
{
lista1.reverse();
}
else
{
while(stos1.empty()==false)
{
x = stos1.top();
stos1.pop();
lista1.push_front(x);
}
lista1.reverse();
}
while(lista1.empty()==false)
{
if(lista1.front() >= '0' && lista1.front() <= '9')
{
char g;
g = lista1.front();
stos2.push((float)g-'0');
lista1.pop_front();
}
else if(lista1.front()=='+')
{
float b,c;
b = stos2.top();
stos2.pop();
c= stos2.top();
stos2.pop();
d=b+c;
stos2.push(d);
lista1.pop_front();
}
else if(lista1.front()=='*')
{
float b,c;
b = stos2.top();
stos2.pop();
c= stos2.top();
stos2.pop();
d=b*c;
stos2.push(d);
lista1.pop_front();
}
else if(lista1.front()=='-')
{
float b,c;
b = stos2.top();
stos2.pop();
c= stos2.top();
stos2.pop();
d=b-c;
stos2.push(d);
lista1.pop_front();
}
else if(lista1.front()=='/')
{
float b,c;
b = stos2.top();
stos2.pop();
c= stos2.top();
stos2.pop();
d=c/b;
stos2.push(d);
lista1.pop_front();
}
}
float f;
f = stos2.top();
std::cout<<"\nwynik: "<<f<<std::endl;
}
i plik Odwrotna_Notacja_Polska.h
#pragma once
class Odwrotna_Notacja_Polska
{
private:
char wyrazenie[50];
public:
void zapamietaj(char * napis);
void oblicz();
};