#include <stdio.h>
#include <stdlib.h>
#define INITIAL_SIZE 5
struct Stack
{
int *items;
int count;
int capacity;
};
typedef struct Stack Stack;
Stack *stack_init();
void stack_push(Stack *stack, int value);
int stack_pop(Stack *stack);
int stack_peek(Stack *stack);
int main()
{
Stack *stack = stack_init();
int number_of_divides = 0;
int number = 0;
int remaining_number = 0;
int number_of_prints;
char character;
while((character = getchar()) != '\n')
{
if(character >= '0' && character <= '9')
{
number = number * 10 + (character - '0');
}
}
while(number > 0)
{
remaining_number = number % 2;
stack_push(stack, remaining_number);
number = number / 2;
number_of_divides++;
}
for(number_of_prints = 0; number_of_prints < number_of_divides; number_of_prints++)
{
printf("%d", stack_pop(stack));
}
return 0;
}
Stack *stack_init()
{
Stack *stack = (Stack *)malloc(sizeof(Stack));
stack->items = (int *)malloc(INITIAL_SIZE * sizeof(int));
stack->count = 0;
stack->capacity = INITIAL_SIZE;
return stack;
}
void stack_push(Stack *stack, int value)
{
if(stack->count == stack->capacity)
{
stack->items = (int *)realloc(stack->items, 2 * stack->capacity * sizeof(int));
stack->capacity *=2;
}
(stack->items)[stack->count] = value;
stack->count++;
}
int stack_pop(Stack *stack)
{
if(stack->count == 0)
{
return -1;
}
stack->count--;
return (stack->items)[stack->count];
}
Това е кодът на моята програма. След проверката на господина той ми каза, че принтирането може да стане и по-лесно. Както виждате, във функцията int stack_pop(Stack *stack), имаме if, който, когато stack->count стане 0, тоест стекът е празен, функцията връща -1. Господинът ме накара да направя принтването така, че то да се изпълнява, докато функцията stack_pop не върне -1. Реших да го споделя с вас, понеже аз досега не бях правил подобно нещо. Това става по аналогия на цикъла while((character = getchar()) != '\n'). Ето я и реализацията :
Цикълът for в main го заменяме със следното :
int result;
while((result = stack_pop(stack)) != -1)
{
printf("%d",
result);
}
Както виждате, цикълът while се изпълнява, докато result е различно от -1, т.е. функцията stack_pop(stack) не върне -1, докато има какво да принтираме. По този начин можем да съставим условието на цикъла while с return на дадена функция. Дано да съм бил полезен :)