Stack mit Array

Razorhawk

Webdesigner und MSP
Ich wollte mal gerne Wissen wie man einen Stack mit Push, Pop und IsEmpty mit einem Array theoretisch schreibt.
Normalerweise macht man das doch mit Pointer und mit hilfe von Free und Malloc oder?
 
Ich versteh nicht ganz was du willst? Willst du deinen eigenen "Stack" in Form eines Arrays haben? Also etwa so:
Code:
class Stack{
public:
  Stack(int size); 
  ~Stack();
  
  void push(unsigned long);
  void pop(unsigned long*);
  bool IsEmpty();
private:
  long * m_stack;
  int m_size;
  int m_sp; // stackpointer - aktuelle Position im Stack
};
 
Zuletzt bearbeitet:
Ja genau ich möchte einen Stack realisieren in Form eines Arrays ohne Pointer und noch zur Info: Ich mache das in C# :)
 
Zuletzt bearbeitet:
Hat sich wahrscheinlich schon erledigt, aber ich habe dennoch eine Frage zu dem Thema.
Bin jetzt schon weiter und hab damit angefangen ein Array-Stack zu schreiben.

Ich habe gerade die Push-Funktion geschrieben und habe den Array-Stack als struct definiert mit enum und union, falls der Inhalt des Stack ein int oder float ist (ich erwarte nur Zahlen als Eingabewerte).

So nun will ich eine Zahl an Push() übergeben und dachte mir ich definiere den Funktionsparameter in Push() auch als den gleichen struct wie das Array, aber das geht os einfach nicht. Ich dachte ursprünglich, dass ich das auch so machen sollte da ich ja nicht weiß ob der übergabewert ein int oder float ist!

Hier mal der bisherige Code:

Code:
#include <stdio.h>
#include <stdlib.h>

#define MAXSTACK 100


enum type {INT,FLOAT};

struct stacktype{

       enum type mytype;
       union variante{
      
            int i;
            float f;
       }value;
} stack[MAXSTACK];

static int top=0;

void push(struct stacktype content){
 
 
  if (top <= MAXSTACK-1){
          
         top++;
         
         if (content.mytype == INT){
         
           stack[top].value.i = content.value.i;                       
         
         }else{
         
           stack[top].value.f = content.value.f;
               
         }
         
  }else{
  
        printf("ERROR out of Memory");
        
  }

     
}

int is_empty(){
 
   if(top == 0){
   
     return(1);
          
   }else{
   
     return(0);
      
   } 

}

int main(int argc, char *argv[])
{
   

    push(7);
    push(8);  
  
  system("PAUSE");	
  return 0;
}
 
Ich kann zwar kein C#, aber das was du geschrieben hast sieht arg nach normalen C Code aus.
Sicher dass du in C# schreibst?

Also auf jedenfall musst du den gleichen Parameter verwenden, auch beim aufrufen:
entweder du machst also immer so:
Code:
   stacktype x;
   x.mytype=INT;
   x.value.i = 10;
   push(x);
oder du definierst dir zwei Funktionen
Code:
push(int i);
push(float f);

die entsprechend reagieren!
 
oh dann hab ich das falsch geschrieben... ich meine natürlich C .... dann war das ein Irrtum ich dachte für C schreibt man auch C# :)

Ich probiers nochmal, aber ich glaube ich habs so schon probiert ;)
 
Wie wärs statt einer überladenen push funktion ein Funktionstemplate.
Code:
template <typename T> void push(T var);
....
push(x);

Leider fallt mir nur grad ned ein wie du während der Laufzeit zwischen einer float und einer int Variable unterscheiden kannst
Code:
    j += sprintf(buffer + j,"%d",x);

oder
Code:
    j+= sprintf(buffer + j,"%f",x);

Ist leider nur ein Ansatz, wenn ich es so wie du realisieren würde, würde ich es mit einem Funktionstemplate in dieser Art probieren. Wenns komplizierter als das wird, pfeiff ich auf Templates da die doch manchmal etwas mühsam sind :)
 
Zurück