Функция для формирования стека - C (СИ)

Узнай цену своей работы

Формулировка задачи:

#include<stdio.h>
#include<conio.h>
 
struct node
{int val;
node*next;};
 
void vvod();
void main()
{
 clrscr();
 void vvod();
}
 
void vvod()
{
 node*stk,*first;
 int el;
 
 stk=NULL;
 scanf("%d",&el);
while(el!=NULL)
{
 first=new(node);
 first->val=el;
 first->next=stk;
 stk=first;
 scanf("%d",&el);
}
}
помогите, пожалуйста, разобраться как правильно оформить функцию для ввода стека в Си

Решение задачи: «Функция для формирования стека»

textual
Листинг программы
#include <assert.h>
#include <stdlib.h>
#include <stdio.h>
 
typedef int value_type;
 
typedef struct node_tag {
        struct node_tag *next;
        value_type value;
} node_t, *pnode_t;
 
typedef pnode_t stack_t, *pstack_t;
 
int empty(pstack_t head) {
        assert(head);
        return (*head == NULL);
}
 
int push(pstack_t head, value_type value) {
        pnode_t node = NULL;
        assert(head);
 
        if((node = (pnode_t)malloc(sizeof(*node))) == NULL) {
                fprintf(stderr, "stack overflow\n");
                return -1;
        }
 
        node->next = empty(head) ? NULL : *head;
        node->value = value;
        *head = node;
 
        return 0;
}
 
int pop(pstack_t head) {
        pnode_t node = *head;
        assert(head);
 
        if(empty(head)) {
                fprintf(stderr, "stack underflow\n");
                return -1;
        }
 
        *head = (*head)->next;
        free(node);
 
        return 0;
}
 
value_type top(pstack_t head) {
        assert(head);
 
        if(empty(head)) {
                fprintf(stderr, "stack underflow\n");
                return 0;
        }
 
        return (*head)->value;
}
 
int main() {
        stack_t s = NULL;
        int i = 0;
 
        for(i = 0; i < 205; ++i) {
                if(push(&s, i + 1) != 0)
                        exit(1);
        }
 
        while(!empty(&s)) {
                printf("%d -> ", top(&s));
                if(pop(&s) != 0)
                        exit(1);
        }
        printf("\b\b\b   \n");
 
        return 0;
}

Объяснение кода листинга программы

  1. Включаем необходимые заголовочные файлы: , ,
  2. Определяем типы данных для узла стека и указателя на узел стека
  3. Создаем typedef для представления стека
  4. Определяем пустоту стека (пустой стек)
  5. Функция для добавления элемента в стек (последовательность push)
  6. Функция для удаления элемента из стека (последовательность pop)
  7. Функция для получения значения верхнего элемента стека (топ)
  8. В функции main создаем стек и инициализируем его как пустой
  9. Запускаем цикл, который заполняет стек элементами от 1 до 204
  10. После заполнения стека, запускаем цикл, который поочередно извлекает элементы из стека и выводит их на экран
  11. В конце программы выводим дополнительный символ   для отделения результатов от остального вывода
  12. Завершаем программу возвратом значения 0, что означает успешное выполнение

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

12   голосов , оценка 3.917 из 5
Похожие ответы