Nano Hash - криптовалюты, майнинг, программирование

Получение ошибки в стеке (Push & Pop)

Я новичок в программировании на языке C. При реализации стека с использованием программы на языке C это дает мне ошибку.

Несмотря на наличие 5-элементного пространства в моем массиве стека, он дает мне «Переполнение стека» (сообщение) во второй итерации цикла for (при нажатии элементов).

& При выводе чисел выводится только первое число (5 раз)

что кажется неправильным?

#include<stdio.h>
#include<conio.h>
#include <stdlib.h>
# define MAX 5
int stack1[MAX];
int top=-1;
void push(int);
int pop();
void display();
main()
{
int choice,num;
while(1)
{
    printf("\nEnter Your Choice: \n");
    printf("Enter 1. to Push \n");
    printf("Enter 2. to pop \n");
    printf("Enter 3. to Display \n");
    printf("Enter 4. To Exit\n");
    scanf("%d",&choice);
switch(choice)
{

case 1:
    printf("Enter Elements to be pushed\n");
    int z;
    for(z=1;z<=5;z++)
    {
    printf("Enter a the code In Room %d: ",z);
    scanf("%d",&num);
    push(num);//Function call, Calling push
    }
    break;
case 2:
    printf("Numbers to be poped\n");
    int b;
    for(b=1;b<=5;b++)
    {
    num=pop();
    }//Return a integer Value;
    break;

case 3:
    display();
    break;
case 4:
    exit(1);
default:
    printf("Invalid Choice\n");
}
}
} 
void push(int element)//Push Function
{
int x;
for(x=1;x<=5;x++)
{
if(top== MAX-1)//Check if Stack is Full
{
    printf("Stack Overflow \n");
    return;//Terminate the function
}
top=top+1;//start from -1 and gets incremented
stack1[top]=element;//insert elements at each step
}
}
int pop()
{
int a;
for(a=1;a<=5;a++)
{

int element;
if(top==-1)
{
    printf("Stack EMPTY can't delete anything");
     return;
}
element=stack1[top];//In stack Elements are Always delete from TOP
top=top-1;//To shift the pointer
printf("%d has been deleted \n", element);
return element;
}
}
void display()
{
int i;
if(top==-1)
{
    printf("Stack Is empty can't display");
    return;//Terminates Display function
}
printf("\n\n");
for(i=top;i>=0;i--)//Displays top elements and decrements on each step
    printf("%d\n",stack1[i]);
}
08.03.2017

  • Это сообщение stackoverflow не имеет ничего общего с вашей структурой данных стека :) 08.03.2017

Ответы:


1

Вы не должны использовать циклы 'for' для извлечения и нажатия.

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
# define MAX 5
int stack1[MAX];
int top=-1;
void push(int);
int pop();
void display();
main()
{
int choice,num;
while(1)
{
    printf("\nEnter Your Choice: \n");
    printf("Enter 1. to Push \n");
    printf("Enter 2. to pop \n");
    printf("Enter 3. to Display \n");
    printf("Enter 4. To Exit\n");
    scanf("%d",&choice);
switch(choice)
{

case 1:
    printf("Enter Elements to be pushed\n");
    int z;
    for(z=1;z<=5;z++)
    {
    printf("Enter a the code In Room %d: ",z);
    scanf("%d",&num);
    push(num);//Function call, Calling push
    }
    break;
case 2:
    printf("Numbers to be poped\n");
    int b;
    for(b=1;b<=5;b++)
    {
    num=pop();
    }//Return a integer Value;
    break;

case 3:
    display();
    break;
case 4:
    exit(1);
default:
    printf("Invalid Choice\n");
}
}
} 
void push(int element)//Push Function
{
int x;

if(top== MAX-1)//Check if Stack is Full
{
    printf("Stack Overflow \n");
    return;//Terminate the function
}
top=top+1;//start from -1 and gets incremented
stack1[top]=element;//insert elements at each step

}
int pop()
{
int a;


int element;
if(top==-1)
{
    printf("Stack EMPTY can't delete anything");
     return;
}
element=stack1[top];//In stack Elements are Always delete from TOP
top=top-1;//To shift the pointer
printf("%d has been deleted \n", element);
return element;

}
void display()
{
int i;
if(top==-1)
{
    printf("Stack Is empty can't display");
    return;//Terminates Display function
}
printf("\n\n");
for(i=top;i>=0;i--)//Displays top elements and decrements on each step
    printf("%d\n",stack1[i]);
}
08.03.2017
  • Почему? за не разрешено? 08.03.2017
  • for выталкивает первый элемент 5 раз. То, как я редактировал вашу программу, имеет смысл. Вы можете нажимать элементы по одному и выталкивать по одному. Заталкивание всех элементов сразу и выталкивание не подходят для стеков. 08.03.2017
  • Да, я знаю, но чтобы решить эту постановку задачи, мне нужно взять 5 элементов за ОДИН ЗАХОД и извлечь их за один раз, поэтому я подумал, что цикл for должен быть лучшим способом сделать это. Можете ли вы предложить другой способ его реализации. 08.03.2017
  • Спасибо, вы лучшие! 08.03.2017

  • 2

    У вас есть 2 for петли. В основной функции есть цикл внутри переключателя, а также есть цикл внутри функций push и pop.

    Функции push и pop будут push или pop только одним элементом и не потребуют внутри него цикла.

    Это было бы более очевидно, если бы вы использовали отступы при написании кода. Это одна из причин правильного отступа вашего кода.

    08.03.2017
  • Да, я знаю, но для того, чтобы решить эту постановку задачи, мне нужно взять (протолкнуть) 5 элементов за ОДИН ЗАХОД и вытолкнуть их за один раз, поэтому я подумал, что цикл for должен быть лучшим способом сделать это. Можете ли вы предложить другой способ его реализации 08.03.2017
  • У вас уже есть цикл в основной функции, который будет помещать 5 элементов. Если у вас есть еще один цикл в функции push, вы пытаетесь поместить в общей сложности 25 элементов. На самом деле, поскольку размер вашего массива равен 5, происходит то, что первый элемент помещается 5 раз, а остальные 4 элемента пытаются нажать (по 5 раз каждый), но обнаруживают, что стек заполнен. Итак, когда вы пытаетесь вытолкнуть, вы выталкиваете первый элемент 5 раз. 08.03.2017

  • 3

    Давайте сделаем это шаг за шагом.

    1). Вы запустили цикл for, чтобы пользователь мог ввести 5 элементов для вашего стека. Как только он вводит номер, вызывается ваша функция push. В push снова у вас есть цикл, который выполняется 5 раз. Таким образом, один и тот же элемент помещается в стек 5 раз. Итак, при следующем выборе стек уже заполнен. Таким образом, сообщение о переполнении стека.

    2). Теперь ваш стек выглядит примерно так: [5,5,5,5,5], предполагая, что 5 было введенным числом 5, в вашей функции pop вы снова запускаете цикл. В идеале вы должны извлекать только один элемент за раз для пользователя. Итак, поскольку вы запускаете цикл, все 5 элементов извлекаются, и поскольку в стеке находится только первый элемент, это то, что вы видите на выходе.

    08.03.2017
  • Итак, какие изменения я должен внести в программу, чтобы сместить указатель и взять (нажать) разные элементы на каждой итерации? 08.03.2017
  • Хорошо. Поскольку у вас уже есть запущенный цикл, который принимает элементы от пользователя, вы просто передаете этот элемент своей функции push. В вашей функции push, которая у вас есть в настоящее время, вам придется удалить цикл for по причине, которую я объяснил выше. Вы просто возьмете этот элемент, увеличите верхнее значение и сделаете stack[top] = yourNewValue. Простой. Кроме того, просто хотел упомянуть, что когда вы определяете массив из 5, индекс начинается с 0. Таким образом, ваш цикл будет выглядеть примерно так: for(i=0;i‹=4;i++), а не от 1 до 5, поскольку стек [5] не определено. 08.03.2017
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

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

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..