Witam,
mam za zadanie napisanie kalkulatora odwróconej notacji polskiej z wykorzystaniem własnej implementacji stosu. Mam stos samorozszerzający się, z którego usunąłem zbędne metody. Nie jestem wirtuozem programowania, ale zawsze staram się pisać kod po swojemu bez kopiowania. Coś jest na pewno źle (bo nie działa), ale ciężko jest mi to zlokalizować. Po kilku godzinach prób, rozpisywania na kartce i przeszukiwania internetu dochodzę do wniosku, że może lepiej jest to tu wrzucić. Może jakaś mądra głowa spojrzy i od razu stwierdzi co jest źle, a może po prostu trzeba to napisać od nowa.
Z góry dziękuję za pomoc.
#include <iostream>
#include <sstream>
#include <string>
using namespace std;
struct lista
{
lista *next;
double dane;
};
class stack
{
lista *stos1;
public:
stack();
~stack();
void push(double);
void pop();
lista *value();
};
stack::stack()
{
stos1=NULL; //zerowanie wskaznika na pierszy element stosu (head)
}
stack::~stack()
{
while (stos1) //dopoki jest cos na glowie to usuwaj
{
pop();
}
}
void stack::push(double v)
{
lista *e = new lista; //stworzenie nowej zmiennej typy strukturowego
e->dane = v; //przypisanie do zmiennej podanej wartosci
e->next = stos1; //przypisanie do wzkaznika szczytu
stos1 = e; //nowy szczyt
}
void stack::pop()
{
if (stos1)
{
lista *e = stos1; //zapamietanie bierzacego szczuty
stos1 = stos1->next;//zamiana wskaznika
delete e; //usuniecie e
}
}
lista *stack::value()
{
return stos1;
}
int main()
{
stack stos1;
stringstream strumien;
string ciagZnakow="33+";
double cyfra_znak;
double a,b,c;
int dlugoscCiaguZnakow=ciagZnakow.length()-1;
for(int i=0; i<=dlugoscCiaguZnakow; i++) //petla odczytujaca kazdy znak ze stringa
{
strumien<<ciagZnakow[i];
if(strumien>>cyfra_znak) //jezeli to co jest w strumieniu jest typu liczbowego (double) to na stos
{
stos1.push(ciagZnakow[i]);
}
else // jak nie to:
{
a=stos1.value()->dane; //wartosc ze szczytu do zmiennej a
stos1.pop(); //zdjecie wartosci ze szczytu
b=stos1.value()->dane; //wartosc ze szczytu do zmiennej b
stos1.pop(); //zdjecie wartosci ze szczytu
switch(ciagZnakow[i]) //w zaleznosci od tego co jest w zmiennej 'cyfra_znak'
{
case '+': c=a+b; break;
case '-': c=a-b; break;
case '*': c=a+b; break;
case '/': c=a+b; break;
}
stos1.push(c); //wynik na stos
}
}
cout<<stos1.value();
return 0;
}