Tworzenie liczbowego stosu strukturalnego

0

Mam takie zadanie:

Napisz program w języku C/C++, który oferuje możliwość tworzenia struktury danych typu stos liczb całkowitych.

Program jak tak ma wyglądać tak samo jak obiektowo, tylko zamiast klasy powinien mieć struct ? Bo czy bez struktury da się napisać stos strukturalnie ? Obiektowo umiem napisać, jednak nie bardzo wiem jak napisać strukturalnie.

dodanie znacznika <quote> - @furious programming

0

Khe?

#Nie istnieje taki język jak C/C++.
#W tym zadaniu nie ma mowy o żadnym programowaniu strukturalnym.
#http://pl.wikipedia.org/wiki/Struktura_danych
#Napisz zwykłą klasę stosu.

0

_
Zmień odrobinę nazwę i ogranicz delikatnie funkcjonalność, voila.

0

Ale klasa to już programowanie obiektowe, a ma być stos napisany strukturalnie.

0

Tylko za bardzo nie wiem jak za pomocą listy mogę napisać stos. Tak jak wcześniej pisałem obiektowo napisać potrafię.

0

Ale klasa to już programowanie obiektowe, a ma być stos napisany strukturalnie.

Jak rozumiem dla ciebie kod poniżej to programowanie obiektowe?

using System;
using System.Linq;
using System.Collections.Generic;

public class Test
{
	public class IntStack {
		public IList<int> Data { get; set; }
		
		public static void Init(IntStack stack) {
			stack.Data = new List<int>();
		}
		
		public static void Push(IntStack stack, int value) {
			stack.Data.Add(value);
		}
		
		public static int Pop(IntStack stack) {
			var value = stack.Data[stack.Data.Count - 1];
			stack.Data.RemoveAt(stack.Data.Count - 1);
			return value;
		}
		
		public static void Print(IntStack stack) {
			Console.WriteLine(string.Join(", ", stack.Data.Select(i => i.ToString())));
		}
	}
	
	public static void Main()
	{
		var stack = new IntStack();
		IntStack.Init(stack);
		IntStack.Push(stack, 3);
		IntStack.Push(stack, 4);
		IntStack.Push(stack, 5);
		IntStack.Print(stack);
		Console.WriteLine("last: {0}", IntStack.Pop(stack));
		IntStack.Pop(stack);
		IntStack.Print(stack);
	}
}
0

Tak, a tak nie jest ? Już jest klasa i posługujemy się obiektami. To kiedy programowanie jest obiektowe ?

0

To kod n0name'a jest obiektowy czy nie ?

0

Programowanie obiektowe jest wtedy, gdy używamy klas jako blueprintów do modelowania obiektów ze świata rzeczywistego i interakcji między nimi, hermetyzując ich bebechy.
Jeśli ktoś używa klasy jako pojemnika na dane (struktury) i definiuje zestaw nie powiązanych funkcji z samą strukturą, to to jest programowanie strukturalne.

0

To taka implementacja stosu jest obiektowa czy strukturalna, tutaj funkcje są powiązane ze strukturą , więc obiektowe ?

#include <iostream>

using namespace std;

class stack
{
public:
    int m_count;
    int max_size;
    int *tablica;

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

    void init(int max)
    {
        max_size = max;
        m_count = 0;
        tablica = new int [max_size];
    }

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

    bool empty()
    {
        return m_count == 0;  // !m_count
    }

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

    bool full()
    {
        return m_count == max_size;
    }

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

    void destroy()
    {
        delete [] tablica ;
    }

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

    void Push(int number)
    {
        if(m_count < max_size)
        {
            tablica[m_count++] = number;
        }

    }

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

    int Top(void)
    {
        if(m_count)
        {
            return tablica[m_count - 1];
        }

    }

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

    int Pop()
    {
        if(m_count)
        {
            --m_count;
        }
    }

};
int main()
{
    int number_user;
    int count_number;

    cout << "Podaj ilosc liczb ktore chcesz wlozyc na stos: ";
    cin >> count_number;

    stack s1;
    stack s2;

    s1.init(count_number);
    s2.init(count_number);

    cout << "\nPodawaj kolejne liczby stosu:\n\n";
    for(int i = 0; i < count_number; ++i)
    {
        cin >> number_user;
        s1.Push(number_user);
    }

   for(int i = 0; i < count_number; ++i)
    {
       s2.Push(s1.Top());
       s1.Pop();
    }
    cout << endl;
    for(int i = 0; i < count_number; ++i)
    {
        cout << s2.Top() << endl;
        s2.Pop();
    }

    return 0;

}
 
0

No i nie ma problemu. Zdefiniuj strukturę stosu z jakimś kontenerem (dla C będzie to najprostsza tablica, dla C++ polecam vector), dodaj do struktury pole maxsize oraz size. W maxsize będzie maksymalna wielkość stosu a w size jego aktualna wielkość.
Zaimplementuj funkcje obsługi stosu (push(), pop() itd... ) które przyjmują jako 1 argument wskaźnik na strukturę stosu i wykonują operacje na tymże stosie i masz strukturalną implementację.
O masz... http://groups.csail.mit.edu/graphics/classes/6.837/F04/cpp_notes/stack1.html
Tylko poczytaj o stosie i trochę poćwicz z nim jak działa.

0

Jeśli funkcję Pop mam zapisaną w ten sposób:

 void Pop(Stack *S)
    {
        if(S->m_count)
        {
            S->(--m_count);
        }
    }

To jak sprawić aby kompilator nie pokazywał błędu ? Chodzi o ten operator --. Przed nim jest wskaźnik i przez to jest błąd. Nie wiem jak poprawnie to zapisać.

1
--(S->m_count)

nawiasy nie są wymagane

0

Czy ten kod teraz jest strukturalny i czy jest dobry? :

#include <iostream>

using namespace std;

struct Stack
{
    int m_count;
    int max_size;
    int *tablica;
};

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

    void init(Stack *S,int max)
    {
        S->max_size = max;
        S->m_count = 0;
        S->tablica = new int [S->max_size];
    }

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

    bool empty(Stack *S)
    {
        return S->m_count == 0;  // !m_count
    }

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

    bool full(Stack *S)
    {
        return S->m_count == S->max_size;
    }

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

    void destroy(Stack *S)
    {
        delete [] S->tablica ;
    }

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

    void Push(Stack *S,int number)
    {
        if(S->m_count < S->max_size)
        {
            S->tablica[S->m_count++] = number;
        }

    }

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

    int Top(Stack *S)
    {
        if(S->m_count)
        {
            return S->tablica[S->m_count - 1];
        }
        else
        {
            return -1;
        }

    }

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

    void Pop(Stack *S)
    {
        if(S->m_count)
        {
            --(S->m_count);
        }
    }


int main()
{
    struct Stack p;
    struct Stack *s = &p;
    init(s,10);
    Push(s,3);
    cout << Top(s);
    return 0;

}
 
1

Ogólnie nic merytorycznie złego się nie rzuca w oczy, ale jeśli miałbym się czepiać:

  1. Niepotrzebne wcięcie przy tych funkcjach.
  2. Brak konsekwencji przy nazwach, init, empty z małej, a Pop, Top z wielkiej.
  3. Nie wywołałeś destroy() pod koniec.
0

Na razie tylko sprawdzałem czy działa Push i Top, temu destroya nie użyłem. Wcięcia usunę.

0

Jakbyś miał system bez śledzenia pamięci, miałbyś już wyciek....

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