Функция для формирования стека - 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;
}
Объяснение кода листинга программы
- Включаем необходимые заголовочные файлы:
, , - Определяем типы данных для узла стека и указателя на узел стека
- Создаем typedef для представления стека
- Определяем пустоту стека (пустой стек)
- Функция для добавления элемента в стек (последовательность push)
- Функция для удаления элемента из стека (последовательность pop)
- Функция для получения значения верхнего элемента стека (топ)
- В функции main создаем стек и инициализируем его как пустой
- Запускаем цикл, который заполняет стек элементами от 1 до 204
- После заполнения стека, запускаем цикл, который поочередно извлекает элементы из стека и выводит их на экран
- В конце программы выводим дополнительный символ
для отделения результатов от остального вывода - Завершаем программу возвратом значения 0, что означает успешное выполнение