push und pop in C

Gast #3669508
Lesenswert?

Hi, ich versuche ein bisschen C zu lernen.
Wie kann ich die push und pop Befehle in C nachbilden?

Meine Idee:
Unsigned long int stack[50];
Unsigned char stackpointer = 0;


Stack[stackpointer++] = Bla; // push(Bla)

Bluber = stack[--stackpointer]; // pop(Bluber)

Aber wie kann ich mit #define das so schreiben :
    Push(bla)

    Pop(Bluber)

also das ich die Original Asssembler-Syntax habe?
#3669565
Lesenswert?

Tu's in eine struct und mach Funktionen:
1
struct long_int_stack {
2
  unsigned char pointer;
3
  unsigned long int data[50];
4
};
5

6
void long_int_push(struct long_int_stack *stack, long int value) {
7
  stack->data[stack->pointer++] = value;
8
}
9

10
long int long_int_pop(struct long_int_stack *stack) {
11
  return stack->data[--stack->pointer];
12
}

Besser: Nimm statt dem Array nur einen Pointer in die struct:
1
struct long_int_stack {
2
  unsigned char pointer;
3
  unsigned long int *data;
4
};

Dann machst Du noch eine init Funktion (der Rest bleibt gleich):
1
struct long_int_stack long_int_stack_init(long int data[]) {
2
  struct long_int_stack stack = { 0, data };
3
  return stack;
4
}

und du kannst jedes long int Array in einen Stack verwandeln:
1
unsigned long int my_array[50]
2
struct long_int_stack my_stack = long_int_stack_init(my_array);
3

4
long_int_push(&my_stack, Bla);
5
Bluber = long_int_pop(&my_stack);

Noch besser: Nimm gleich einen Pointer als Stackpointer:
1
struct long_int_stack {
2
  unsigned long int *pointer;
3
  unsigned long int *data;
4
};
5

6
struct long_int_stack long_int_stack_init(long int data[]) {
7
  struct long_int_stack stack = { data, data };
8
  return stack;
9
}
10

11
void long_int_push(struct long_int_stack *stack, long int value) {
12
  *(stack->pointer++) = value;
13
}
14

15
long int long_int_pop(struct long_int_stack *stack) {
16
  return *(--stack->pointer);
17
}

Du wirst aber mindestens noch ein Funktion benötigen, die prüft, ob der 
Stack leer ist und irgendwie sicher stellen, dass der Stack nicht 
überläuft, was wiederum erfordert, dass Du wohl auch die Stackgröße 
irgendwo wirst mitführen müssen.

PS: Aller Code ist ungetestet!
Gast #3669586
Lesenswert?

1
#include <stack>
2

3
std::stack<int> myStack;
4

5
int main () {
6
  myStack.push (3);
7
  myStack.push (27);
8
  
9
  std::cout << myStack.top (); myStack.pop ();
10
  std::cout << myStack.top (); myStack.pop ();
11
}
Gast #3669621
Lesenswert?

Tja BattMan,
dann erkläre mir doch mal bei all deinem allwissen, warum .net eine 
queue mitbringt. dein gesülze ist unlogisch. ein stack verliert absolut 
nicht seine berechtigung bei der vernwendung einer hochsprache.
Gast #3669683
Lesenswert?

Auch wenn es schon Klassen und Templates gibt: es ist immer gut auch die 
Grundlagen davon zu wissen. Von daher ist eine eigene Implementation zu 
Lernzwecken eine gute Sache. Einmal gemacht. Verstanden wie es geht. Und 
dann die vorgefertigten Teile weiter benutzt.

An Maddel: vergiss Makros. Das verwirrt Anfänger und führt nur zu 
Problemen.
Basis in C sind die Funktionen. Schreib saubere Funktionen jeweils für 
Push und Pop. Dann spielt mal damit. Debugausgaben rein. Und auch mal 
schauen was passiert, wenn man zuviel pusht/popt und wie man das 
abfängt.
Gast #3669695
Lesenswert?

zur ursprünglichen frage:
@ maddel ihm sein kumpel
schaut doch ganz gut aus!
anstatt das ganze in ein makro zu packen, schau dir mal inline 
funktionen an. der compiler macht effektiv das gleiche daraus, der code 
ist aber sauberer
#3669727
Lesenswert?

Oliver S. schrieb:
> A. H. schrieb:
>> Tu's in eine struct und mach Funktionen:
>
> Ganz ehrlich, ich denke deine Antwort ist für jemanden, der im C-Buch
> noch nicht mal bis zu Kapitel "Funktionen" gelesen hat, leicht
> over-engineered.

Die einzige Konsequenz fuer den TO kann dann aber nur sein, nach den 
bisher gelesenen 20 Seiten auch die restlichen 250 Seiten mal in Angriff 
zu nehmen.
Gast #3669930
Lesenswert?

Hi,
ich würde das so machen:
1
enum{push,pop};
2

3
uint32_t Stack(uint8_t operation,uint32_t data)
4
{
5
    static uint32_t stack[100];
6
    static uint8_t pointer = 0; // ob diese Initialisierung so richtig ist?!
7
    if(operation == push)
8
    {
9
        stack[pointer++] = data;
10
        if(pointer > 99) pointer = 99;//overflow verhindern
11
    }
12

13
    if(operation == pop)
14
    {
15
        if(pointer == 0) pointer = 1;//underflow verhindern
16
        data = stack[--pointer];
17
    }
18
    return data;
19
}
Nur so Idee, ist nicht getestet!
#3669943
Lesenswert?

Peter Zz schrieb:
> ich würde das so machen:

Ich nicht, und vermutlich auch kaum sonst jemand.

Macht aber nichts, da der TO vor Schreck schon lange das Weite gesucht 
hat, und mit all den hier genannten Lösungsvorschlägen eh nichts 
anfangen kann.

Denn seine Frage war ja nicht nach stack und push und pop, sondern: Wie 
schreibe ich eine Funktion in C, und wie rufe ich die auf, was ist das 
alles überhaupt, und überhaupt überhaupt ?

Oliver
#3669968
Lesenswert?

Oliver S. schrieb:
> A. H. schrieb:
>> Tu's in eine struct und mach Funktionen:
>
> Ganz ehrlich, ich denke deine Antwort ist für jemanden, der im C-Buch
> noch nicht mal bis zu Kapitel "Funktionen" gelesen hat, leicht
> over-engineered.
>
> Oliver

Ich weiß, es mag auch etwas gemein sein, ist aber ein Stück weit auch 
Methode: Man muss ja immer auch mit Leuten rechnen, die hier einfach nur 
ein paar Dumme suchen, um billig ihre Hausaufgaben gemacht zu bekommen. 
Deshalb versuche ich ganz bewusst meine Antworten immer ein Stück 
anspruchsvoller zu gestalten, als es für die Lösung der Aufgabe 
eigentlich notwendig wäre. Jemand, der wirklich am Lernen interessiert 
ist, wird das hoffentlich als willkommene Anregung verstehen. Jemand, 
der nur eigene Anstrengung vermeiden möchte, dürfte mit der Lösung 
dagegen nicht glücklich werden (und wird hoffentlich nicht dumm genug 
sein, eine Lösung, die er nicht wirklich versteht als seine eigenen zu 
verkaufen).

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren