Odwrócona notacja polska

Odpowiedz Nowy wątek
2020-07-28 20:37

Rejestracja: 1 tydzień temu

Ostatnio: 11 godzin temu

0

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

Pozostało 580 znaków

2020-07-30 22:19

Rejestracja: 2 miesiące temu

Ostatnio: 13 godzin temu

0

Nie wiem kto i co tu stworzyć chce - pewnie bicz z gówna?

  1. Stos to jest zwyczajna tablica, której koniec (wierzchołek) pamiętamy
  2. można taki stos powiększać 'w locie', ale w praktyce jest to zbyteczne - w 99.99%.
  3. operacje na stosie robimy... tak samo jak na tablicy - nie ma tu o czym gadać;
    push i pop to banały...
  4. nie ma stosów listowych, co tu próbuje produkować autor - to jest bezużyteczna bzdura!
  5. listy: jedno i dwu-kierunkowe - to banały z lat 70-tych, nikt tego nie używa... a może nawet nigdy nie było to używane!
Hejtujesz człowieka bezsensownie, Wytłumacz mu lepiej co to jest ALgebraic Data Type, cos się nauczy. - lion137 2020-07-30 22:30
Co do nie używania lista, to bzdura. W embeded i programowaniu systemowym, zwłaszcza w jądrach systemów, to użyteczne struktury dla niektórych problemów. - nalik 2020-07-30 22:36
Żeby nie być gołosłownym, przykładowo wystarczy sprawdzić jak zaimplementowane są bufory dla pakietów sieciowych w linuxie (sk_buff) i freebsd (mbuf). Listy panie, listy. - nalik 2020-07-30 22:39
prawdopodobnie błędnie - zgłoś to do autorów, żeby dopracowali... :) - bonifacy 2020-07-30 22:47
listy: jedno i dwu-kierunkowe - to banały z lat 70-tych, nikt tego nie używa... a może nawet nigdy nie było to używane! - nikt oprócz lwiej części języków funkcyjnych. Swoją drogą pracuję w automotive i tutaj też udajemy, że używamy takich list. - part 2020-07-31 08:21

Pozostało 580 znaków

2020-07-30 23:11

Rejestracja: 2 miesiące temu

Ostatnio: 13 godzin temu

0

Przykład praktycznej Implementacji stosu 'dynamicznego':

push(value)
{
if( free_space < value.size ) resizeFibonacci(); // !
// dalej standard
copy(top, value);
top += value.size;
}

stack::resizeFibbonacci()
{
newsize = nextFibonaccinumber(size); // np. 2 -> 3, 3 -> 5, 5 -> 8, 8 -> 13, itd.
realloc(stack, newsize);
}

zasada jest prosta: wszelki wzrost w naturze ma tendencję do wzrostu w tempie ciągu Fibonacciego,
więc należy to uwzględnić - w celu optymalizacji kodu!

Można próbować wzrost poprzez podwajanie: n -> 2n, ale to już przesada - za szybko, i gorzej wyjdzie w praktyce! :)

Pozostało 580 znaków

2020-07-30 23:16

Rejestracja: 3 lata temu

Ostatnio: 1 minuta temu

1

Myślałem, ze Trolujesz, ale widze, że coś tam Wiesz:). Jaki to przyklad implementacji, mix pseudokodu i C, niekompletna metoda push i resize, a co dalej, Potrafisz pociągnąc?:)


Pozostało 580 znaków

2020-07-30 23:39

Rejestracja: 2 miesiące temu

Ostatnio: 13 godzin temu

0

Nie żartuj sobie ze starego zawodowca, bo jeszcze przypadkiem wygrasz a wtedy przegrasz. :)

Pozostało 580 znaków

2020-07-30 23:41

Rejestracja: 3 lata temu

Ostatnio: 1 minuta temu

0

Przegra, wygra, zremisuje, a jak się spotkamy na rekrutacji, to mnie Przyjmiesz?:)


Pozostało 580 znaków

2020-07-30 23:54

Rejestracja: 2 miesiące temu

Ostatnio: 13 godzin temu

0

Nie znam się na 'rekrutacji', i nie chcę.. - to wasz światek, bawcie się.

Pozostało 580 znaków

2020-07-31 00:06

Rejestracja: 3 lata temu

Ostatnio: 1 minuta temu

1

Odbieglismy od tematu, fajny fibonacci heap Zapodałeś, Mógłbyś rozwinąć, jakiś pseudokod? Bym sobie popaczał.


Pozostało 580 znaków

2020-07-31 00:43

Rejestracja: 2 miesiące temu

Ostatnio: 13 godzin temu

0

Ten motyw z fibonaccim ma istotne znaczenie dopiero w dużych bazach danych, w przypadku stosu to jest w zasadzie banał;
bo tu można sobie z mety zaimplementować stos: 100 x średnia (przewidywalna), i będzie dobrze - bez realokacji.

Generalna uwaga: matematyka, czyli inaczej: numerologia, została zakazana z 500 lat temu - przez Wielką Inkwizycję, zatem nie wolno tego używać:

dlaczego?

sin(666 stopni) = -Phi/2;

cos(6 x 6 x 6 = 216 stopni) = ?

666 = 6 x 111;
111 = 3 x 37.
37 = ?

wszelka użyteczna wiedza jest zakazana, jednie pierdoły wolno nauczać.

edytowany 3x, ostatnio: bonifacy, 2020-07-31 00:59
Jednak troll - lion137 2020-07-31 01:17
Muszę przyznać, że tytuł odwrócona notacja polska i kalkulator w treści sugerował mi, że wiadomo czego się spodziwać. A... jednak nie. Nie wiem nawet co tu się dzieje. - jarekr000000 2020-07-31 04:57

Pozostało 580 znaków

2020-08-01 14:14

Rejestracja: 2 miesiące temu

Ostatnio: 13 godzin temu

0

No to masz gotowy kalkulator, który robiłem z 20 lat temu:
https://easyupload.io/gqgbfu
wersja testowa.

Pozostało 580 znaków

wczoraj, 18:20

Rejestracja: 1 tydzień temu

Ostatnio: 11 godzin temu

0

Ok, to może po kolei.
Po pierwsze dziękuję bardzo za zaangażowanie się w odpowiedź. Nie spodziewałem się takiej dyskusji.
Po drugie dzięki za podsunięcie mi std::vector. To jest coś pięknego. Stos który mi wcześniej zajmował ponad 100 lini teraz zajmuje 32, choć pewnie dałoby się go jeszcze skrócić. Poza tym napisałem go w 10min gdzie wcześniej ... yyy nie napiszę ile mi to zajęło ;), ale jak teraz to napisałem w 10 min to byłem w lekkim szoku, że się tak da.
Dalej, jak nalik zauważył jestem totalnym szczypiorem w programowaniu, a musze napisać trochę tego typu programów gdyż wykładowca tego wymaga
Kolejna kwestia to widzieć wasze zaangażowanie i ewidentną pasję to jest moc. Przede wszystkim uwielbiam ludzi z pasją, ale teraz to i ja mam o wiele większą motywację do nauki. Właściwie to teraz jak wracam z pracy to od razu siadam do kodu (tak, studiuję zaocznie). Wcześniej musiałem się zmuszać. Po moim pierwszym poście dzięki Waszym odpowiedziom już lubię te forum i na pewno będę często tu bywał.

To teraz a propos kalkulatora. Przepisałem ten udostępniony przez _13th_Dragon z małymi zmianami. Jak wiadomo gdy się coś przepisuje to też się uczy. No i wydaje mi się, że rozumiem wszystko co jest tam zawarte, jednak zastanawiam się dlaczego tutaj:

            if(znak=="add") stos.push_back(a+b);
            else if(znak=="sub") stos.push_back(a-b);
            else if(znak=="mul") stos.push_back(a*b);
            else if(znak=="div") stos.push_back(a/b);
            else if(znak!="") cout<<"Bad operation: "<<znak<<endl;
            else break;

nie mogę użyć znaków dodawania, odejmowania itd.

            if(znak=="+") stos.push_back(a+b);
            else if(znak=="-") stos.push_back(a-b);
            else if(znak=="*") stos.push_back(a*b);
            else if(znak=="/") stos.push_back(a/b);
            else if(znak!="") cout<<"Bad operation: "<<znak<<endl;
            else break;

W treści mojego zadania jest przykład danych wejściowych i to powinny być owe znaki. Próbowałem i chciałem się nawet pochwalić gotowym kodem, ale nie wyszło. Dla stringa = "3 3 +"; konsola pokazuje tylko 3.

PS Odpisuję dopiero teraz bo w między czasie robiłem inne zadania na reprezentacje grafów w komputerze. Nie wykluczam, że może też będę później potrzebował w tym temacie pomocy, ale to już w innym poście

edytowany 3x, ostatnio: Shimek, wczoraj, 18:25
A nie możesz sprawdzić?:) - lion137 wczoraj, 18:25
Jakbym słyszał mojego kolegę co programuje zawodowo: "Naucz się szukać informacji!" :D - Shimek wczoraj, 18:44

Pozostało 580 znaków

Odpowiedz

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0