2013-09-12 3 views
2

Итак, я написал программу для ввода пользователя в стек. Но, несмотря на мои строгие попытки, я не мог правильно вставить данные. Он показывает, что данные были вставлены, но пока отображается, отображается значение мусора. Вот моя главная функция:Правильное значение пользовательского ввода не вставлено в стек

//Stack 
#include<stdio.h> 
#include<stdlib.h> 
#define MAXSTK 10 

void push(int *, int, int *, int); 
//void pop(); 
void show_stack(); 
int main() 
{ 
int ch, ch1, stack[MAXSTK], top=-1; 
do{ 
    printf("\n <<Stack MENU>>"); 
printf("1. Add Element"); 
printf("2. Delete Element"); 
printf("3. Show Stack"); 
printf("4. Exit menu"); 
printf("\n Enter your choice->"); 
scanf("%d", &ch); 

    switch(ch) 
    { 
     case 1: printf("\n Enter element to add->"); 
      scanf("%d",&ch1); 
      push(stack,ch1, &top, MAXSTK); 
      break; 
      /* case 2:  pop(); 
      break;*/ 
     case 3: printf("\n The stack is->"); 
      show_stack(stack, MAXSTK); 
      break; 
     default: printf("\n Invalid Choice!!!"); 
      break; 
     } 
}while(ch!=4); 
return 0; 
    } 

А вот моя функция проталкивания:

void push(int newstack[], int num, int *newtop, int bound) 
{ 
*newtop=*newtop+1; 
if(*newtop==0) 
printf("\n Stack was Empty. New Value inserted."); 

if(*newtop>(bound-1)) 
{ 
    printf("\n Caution! OVERFLOW!!!"); 

} 
newstack[*newtop]=num; 
} 

А вот мое шоу функция:

void show_stack(int newstack[], int bound) 
{ 
int i; 
printf("\n"); 
for(i=0;i<=bound;i++) 
printf("%d",newstack[i]); 
}  

Пожалуйста, помогите мне найти ошибку.

ответ

5

Вы передаете длину массива и распечатываете все элементы массива. поэтому вы видите стоимость мусора. Попробуйте напечатать только вставленные элементы.

show_stack(stack, top); 

и ваш прототип функции должен быть

void show_stack(int *,int); 

вы увеличиваете свой NEWTOP каждый раз, независимо от переполнения. это плохая практика. Это вызовет проблемы во время popping() и show_stack(). вы можете сделать что-то подобное, чтобы избежать этого.

void push(int newstack[], int num, int *newtop, int bound) 
{ 
    // if newtop is < 0 display the message 
    if(*newtop<0) 
     printf("\n Stack was Empty. New Value inserted."); 
    // newtop will always point to top element. so if newtop is 9 it means your stack is full. so if newtop is >= bound-1(9) stack is full 
    if(*newtop>=(bound-1)) 
     printf("\n Caution! OVERFLOW!!!"); 
    else 
    { 
     *newtop=*newtop+1; //increment newtop 
     newstack[*newtop]=num; //store value in newtop 
    } 
} 
+1

Блестящее объяснение. Благодарим вас за указание на логическую ошибку в функции push. Ошибка, о которой вы упомянули, тоже возилась с моим стеклом; Я поймал его во время шоу. +1 – Mistu4u

4

Вы звоните show_stack вместимость (MAXSTK), а не его фактический размер. Поэтому он отображает все элементы в stack, какими бы значениями они ни были. Просто назовите его с помощью top, вместо этого исправите проблему.

Другое примечание. Ваше объявление show_stack не соответствует списку аргументов реализации.

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