2014-03-27 7 views
1

Итак, в течение нескольких дней теперь я убиваю себя, как сделать стек, содержащий структуры. Вначале я думал, что это будет легко, но оказалось, что это не для меня.Как создать стек, содержащий структуры?

Таким образом, проблема заключается в следующем: пользователь дает размер стека, а затем я должен инициализировать стек, затем идет push, pop и display. Теперь я беспокоюсь, как его инициализировать. Я знаю, что мне нужно сделать это с помощью malloc, но я не знаю, как это сделать.

Примечание: Структуры, которые должны быть в стеке, являются «шпилькой» и «профи».

Heres стек Я сделал:

struct MyStack 
{ 
    int head; 
    void **stack; 
    int size; 
}; 
typedef struct MyStack STACK; 
struct stud 
{ 
    char flag; 
    char fname[50]; 
    int semester; 
}; 
struct prof 
{ 
    char flag; 
    char fname[50]; 
    char course[30]; 
}; 
int main() 
{ 
    int size,sel; 
    size=GiveSize(); 
    STACK NewStack; 
    NewStack.size = size; 
} 

что теперь? Это:

NewStack.stack = (структура * ("Prof" или "шпильки")?) ТаНос (размер * SizeOf (структура ("проф" или "шпильки")

Как я могу знать? какой типа стек?

Спасибо Chnossos !! вы мне очень помогли :)

ответ

-3

вы можете просто использовать шаблон объект стека путем включения заголовочного стека

#include<iostream> 
#include<stack> 

using namespace std; 

struct stud 
{ 
    char flag; 
    char fname[50]; 
    int semester; 
}d; 
int main() 
{ 
    stack<stud> s; 
    stud d; 
    d.flag='a'; 
    strcpy(d.fname,"saurah"); 
    d.semester=4; 
    s.push(d); 
    stud f=s.top(); 
    s.pop(); 
    cout<<f.fname; 
    return 0; 
    } 
+3

Это не в C. –

1

просто сделать что-то подобное ...

void print_stack (STACK * stack) 
{ 
    struct stud * s; 
    s = stack->stack[0]; 
    printf("Student (%c) %s is in semester %d.\n", s->flag, s->fname, s->semester); 
} 

int main() 
{ 
    struct stud student = { 's', "toto", 1 }; 
    int size, sel; 

    size = GetSize(); 
    STACK NewStack; 

    NewStack.size = size; 
    NewStack.stack = malloc((size + 1) * sizeof(void *)); 
    NewStack.stack[size] = NULL; 

    NewStack.stack[0] = &student; 

    print_stack(&NewStack); 

    return 0; 
} 

... который успешно принт Student (s) toto is in semester 1..


Чтобы напечатать весь стек:

#define STUDENT_FLAG 's' 
#define PROF_FLAG  'p' 

void print_student (struct stud *s) 
{ 
    printf("Student (%c) %s is in semester %d.\n", s->flag, s->fname, s->semester); 
} 

void print_prof (struct prof *p) 
{ 
    printf("Prof (%c) %s is in course %d.\n", p->flag, p->fname, p->course); 
} 

void print_full_stack (STACK * stack) 
{ 
    char flag; 
    int i; 

    for (i = 0 ; i < stack->size ; ++i) 
    { 
     flag = *(char *)(stack->stack[i]); 
     if (flag == STUDENT_FLAG) 
      print_student(stack->stack[i]); 
     else if (flag == PROF_FLAG) 
      print_prof(stack->stack[i]); 
    } 
} 

Обратите внимание, что это будет работать только если переменная flag объявлена ​​первым в каждой структуре, хранящейся в стеке.

+0

Почему это «размер + 1», а не просто «размер»? – CosmaOne

+0

Таким образом вы можете NULL-завершить массив. Это не требование, так как вы храните размер, а это всего лишь один из моих рефлексов. – Chnossos

+0

если бы я хотел показать все структуры в стеке, используя для (..), как бы он выглядел внутри функции? ех. PrintFullStack() – CosmaOne

Смежные вопросы