Задачата от последния час - от десетично в двоично, реализирано със статичен стек

33 views
Skip to first unread message

Bozhidar Nikolov

unread,
Jun 22, 2013, 6:52:39 AM6/22/13
to prog1...@googlegroups.com

#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 на дадена функция. Дано да съм бил полезен :)

Reply all
Reply to author
Forward
0 new messages