2014-03-27 20 views
1

因此,過了幾天,我就自殺瞭如何製作一個包含結構的堆棧。一開始我認爲這很容易,但事實證明它不是(對我來說)。如何製作包含結構的堆棧?

所以問題是這樣的:用戶給出堆棧的大小,然後我必須初始化堆棧,然後推,彈出和顯示。我現在關心的是如何初始化它。我知道我必須用malloc來做,但我不知道如何。

注:應該堆棧的結構是「stud」和「prof」。

繼承人的堆棧我做:

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 =(結構*( 「教授」 或 「雙頭」)?)的malloc(大小*的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