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();
};