2014-09-10 3 views
0

Я пытаюсь убедиться, что моя функция стека инициализации получает все значения, вводимые пользователем, но сейчас мои коды печатают разные значения из исходных значений, которые я вводил. Я использовал. Кроме того, я работаю над различными функциями для работы со стеклом, такими как pop, push, переходит в начало стека и т. Д. Будут ли они работать во время цикла? Однако, здесь функцию стека инициализацииИнициализация стека до 10 значений

typedef struct stack 
{ 
    int* darr; 
    int size; 
    int top; 
}stack; 

stack * initStack(int elements) 
{ 
    stack *s; 

    s = (stack *)malloc(sizeof(stack)); 
    s->darr = (int *)malloc(sizeof(int)*elements); 
    s->size = 0; 
    s->top = elements; 

    return s; 
} 

в основной()

int main() 
{ 
    stack s; 
    int i; 

    printf("Hello user, please enter 10 different values to build your stack: \n"); 

    for(i = 0; i < 10; i++) 
    { 
     scanf("%d", initStack(i)); 
    } 

    printf("\nYou entered: \n%d\n\n", initStack(i)); 

    return 0; 
} 
+0

немного слишком много вещей, чтобы изменить там: выделение (вы выделить 10 стеков, пустых), вы Scanf целого числа в структуры, печать мусора (потому что вы выделить новый стек и вы вернетесь, что) и в любом случае вы просите распечатать много целых чисел, но вы передаете одно значение стека *. Вызов initstack только один раз с помощью стека * pStack = initstack (10) и printf/scanf в pStack-> darr ... –

+0

Ваше использование 'scanf' и' printf' неверно. Будет полезно прочитать учебное пособие или два о том, как их использовать. Вот стартер. http://www.codingunit.com/printf-format-specifiers-format-conversions-and-formatted-output –

+0

В C вы не должны бросать 'malloc' - [ли я делаю результат malloc?] (http: //stackoverflow.com/questions/605845/do-i-cast-the-result-of-malloc) – crashmstr

ответ

0
#include <stdio.h> 
#include <stdlib.h> 
#include <stdbool.h> 

typedef struct stack { 
    int* darr; 
    int size; 
    int top; 
}stack; 

stack *initStack(int elements){ 
    stack *s; 

    s = (stack *)malloc(sizeof(stack)); 
    s->darr = (int *)malloc(sizeof(int)*elements); 
    s->size = 0; 
    s->top = elements; 

    return s; 
} 

void dropStack(stack *s){ 
    free(s->darr); 
    free(s); 
} 

void push(stack *s, int v){ 
    if(s->top == 0){ 
     fprintf(stderr, "stack full!\n"); 
     return ; 
    } 
    s->darr[--s->top] = v; 
    ++s->size; 
} 

bool isEmpty(stack *s){ 
    return s->size == 0; 
} 

int pop(stack *s){//need check by isEmpty before pop 
    --s->size; 
    return s->darr[s->top++]; 
} 

int main(void) { 
    stack *s = initStack(10); 
    int i; 

    printf("Hello user, please enter 10 different values to build your stack: \n"); 

    for(i = 0; i < 10; i++){ 
     int value; 
     scanf("%d", &value); 
     push(s, value); 
    } 

    while(!isEmpty(s)) 
     printf("\nYou entered: \n%d\n", pop(s)); 

    dropStack(s); 
    return 0; 
} 
0

слишком много вопросов здесь. Ваше объявление stack s; в main(), по-видимому, указывает, что вы не хотите динамически выделять сам стек, а только его элементы. Если да, то почему у вас есть объявление stack *s; в вашем initStack()? Похоже, вы пытаетесь использовать initStack(), чтобы делать разные вещи, что только добавляет к двусмысленности.

  • Изменить декларацию stack s; в main() к stack *s;

  • В вашем initStack() выделения памяти и возвращает значение указателя в main(). Вызовите его только один раз и используйте другую функцию для выполнения операций push и pop. Когда вы выделяете память для каждого вызова, вы в основном создаете несколько стеков.

  • Кажется, что вам нужно всего лишь десять элементов в стеке. Поэтому вы не должны выделять s->darr для размера element для каждого звонка. Сделайте это один раз и передать значение размера:

    stack* initSize(int numElements) { 
        stack *s = NULL; 
        if (s == NULL) { 
         s = malloc(sizeof(stack)); 
         s->darr = malloc(sizeof(int) * numElements); 
        } 
        s->size = 0; 
        s->top = 0; 
        //s->limit = numElements; Add a new member like this to your structure to check during insertion, so that we don't overflow 
        return s; 
    } 
    
  • Ваш толчок() будет выглядеть следующим образом:

    int push(stack *s, int item) { 
        if (s != NULL) { 
         if (s->size < s->limit) { 
          s->darr[s->size] = item; 
          s->top = s->size; 
          s->size++; 
          return 0; //indicates success 
         } else { 
          retrun -1; //indicates failure, stack is full 
         } 
        } 
        return -1; //invalid stack pointer 
    } 
    
  • Ваш pop() будет выглядеть примерно так:

    void pop(stack *s) { 
        if(s != NULL) { 
         s->size--; 
         s->top = s->size; 
        } 
    } 
    
  • Ваш top() будет выглядеть примерно так:

    int top(stack *s) { 
        if (s != NULL) { 
         return s->darr[s->top]; 
        } 
        return -1;//something to indicate that it is an invalid stack, if you are going to store -1 as an item, this return will be confusing, so pick a unique value 
    } 
    
Смежные вопросы