Проблема массива стека C - PullRequest
0 голосов
/ 11 апреля 2011

Мой код функции для просмотра не работает? это почему? Может ли кто-нибудь помочь мне с моей функцией взгляда?

#include<stdio.h>
#include<stdlib.h>
#define maxsize 10

int stack[maxsize];
int stacktop=0;

void instructions();
int process();
int push(int value);
int pop();
void display();
void peek();

int main()
{
    process();
    getch();
}

int process()
{
    int val;
    int choice;
    do
    {
        instructions();

        printf("Enter Your Choice: ");
        scanf("%d",&choice);

        switch( choice )
        {
        case 1:
            printf("\nElement to be Pushed : ");
            scanf("%d",&val);
            push(val);
            break;

        case 2:
            val=pop();
            if(val!=-1)
            {
                printf("Popped Element : %d\n",val);
            }
            break;

        case 3:
            peek();
            break;

        case 4:
            display();
            break;

        case 5:
            break;       
        }

    }while(choice !=5);
}

void instructions()
{
    printf("Enter Your choice for the following process\n");
    printf("\n[1]Push a Node on top of the list");
    printf("\n[2]Pop a node off the list");
    printf("\n[3]Peek The Top Node");
    printf("\n[4]Display The Whole list");
    printf("\n[5]Exit The Program\n");
}

int push(int val)
{
    if(stacktop<maxsize)
    {
        stack[stacktop++]=val;
    }
    else
    {
        printf("Stack is full");
    }
}

int pop()
{
    int a;
    if(stacktop>0)
    {
        a=stack[--stacktop];
        return a;
    }
}

void display()
{
    int i;
    i = 0;
    if(stacktop>0)
    {
        printf("Elements are:");
        while(i<stacktop)
        {
            printf("\n%d--\n",stack[i++]);
        }

    }
}

void peek()
{
    printf("%d",stacktop);  
}

Ответы [ 2 ]

2 голосов
/ 11 апреля 2011

Я знаю, что это не Проверка кода , но я подумал, что дам вам несколько советов.

  1. Когда вы звоните scanf,всегда проверяйте результат.Например, если пользователь вводит что-то отличное от десятичного числа, ваш код в конечном итоге будет помещать неопределенное значение в переменные choice или val.Функция scanf возвращает количество элементов, которые были успешно прочитаны.Если вы запросили один элемент, а scanf возвращает 1, то вы можете положиться на значение этого объекта:

    int choice;
    if (scanf("%d", &choice) != 1)
        // handle error, can't rely on value of "choice"
    else
        // continue onwards, can rely on value of "choice"
    
  2. Обычно экранирование \n идет наконец строки буквальный, а не в начале.Это более распространенный способ сделать это, но это не значит, что он всегда должен идти в конце.

    printf("Enter Your choice for the following process\n\n");
    printf("[1]Push a Node on top of the list\n");
    printf("[2]Pop a node off the list\n");
    printf("[3]Peek The Top Node\n");
    
  3. Для вывода простых строк рассмотрите возможность использования puts функция, которая автоматически добавляет символ новой строки для вас:

    puts("Enter Your choice for the following process");
    puts("");
    puts("[1]Push a Node on top of the list");
    puts("[2]Pop a node off the list");
    puts("[3]Peek The Top Node");
    
  4. Ваш display метод является прекрасным примером того, когда использовать цикл for вместоwhile петля.Вообще говоря, используйте цикл for, когда вы точно знаете, сколько предметов у вас есть, и хотите перебрать каждый из них:

    void display()
    {
        int i;
    
        puts("Elements are:");
    
        for (i = 0; i < stacktop; i++)
            printf("\n%d--\n", stack[i]);
    }
    
  5. Чтобы изменить порядок стекапросто начните сверху и идите назад:

    void display()
    {
        int i;
    
        puts("Elements are:");
    
        for (i = stacktop - 1; i >= 0; i--)
            printf("\n%d--\n", stack[i]);
    }
    
2 голосов
/ 11 апреля 2011

Это должно быть:

printf("%d\n", stack[stacktop - 1]);

Распечатать содержимое, а не размер стека?

Очевидно, что вам также необходимо проверить границы, чтобы убедиться, что вы не печатаете вне диапазона вашей стопки (когда он пуст)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...