Даниел Илиев
unread,Jun 17, 2013, 11:34:30 AM6/17/13Sign in to reply to author
Sign in to forward
You do not have permission to delete messages in this group
Either email addresses are anonymous for this group or you need the view member email addresses permission to view the original message
to prog1...@googlegroups.com
#include <stdio.h>
#include <stdlib.h>
typedef struct Stack Stack;
typedef struct StackNode StackNode;
struct StackNode
{
int value;
StackNode *next;
};
struct Stack
{
StackNode *top;
int count;
};
Stack *stack_init();
void stack_push(Stack *stack, int element);
int stack_pop(Stack *stack);
int stack_peek(Stack *stack);
int main()
{
Stack *stack = stack_init();
int number = 0;
char c;
while((c = getchar()) != EOF)
{
if(c >= '0' && c <= '9')
{
number = 10 * number + c - '0';
}
}
while(number > 0)
{
if((number % 2) == 0)
{
stack_push(stack,0);
number = number / 2;
}
if((number % 2) != 0)
{
stack_push(stack,1);
number = number / 2;
}
}
while(stack->count > 0)
{
printf("%d",stack_pop(stack));
}
return 0;
}
Stack *stack_init()
{
Stack *stack = (Stack *)malloc(sizeof(Stack));
stack->top = (StackNode *)malloc(sizeof(StackNode));
stack->top->next = NULL;
stack->count = 0;
return stack;
}
void stack_push(Stack *stack, int element)
{
StackNode* node = (StackNode *)malloc(sizeof(StackNode));
node->value = element;
node->next = stack->top;
stack->top = node;
stack->count++;
}
int stack_pop(Stack *stack)
{
if(stack->count > 0)
{
int result = stack->top->value;
StackNode *top_for_deleting = stack->top;
stack->top = stack->top->next;
free(top_for_deleting);
stack->count--;
return result;
}
else
{
return -1;
}
}
int stack_peek(Stack *stack)
{
if(stack->count > 0)
{
return stack->top->value;
}
}
Така младежи това е кода на програмата, която беше дадена днес за 15 точки. Условието е да се преобразува десетично число във двоично, като за тази цел трябва да бъде използван стек.
Обяснение на кода :
1. Виждате че getchar-ваме елементите от in.txt файл, като ако те са числа ги записваме като едно цяло число използвайки 'number = number * 10 + c - '0'' // Обяснението защо използваме това е в един от въпросите в групата.
2. Започваме да делим числото number, което сме getchar-нали от in.txt файла на 2 и в случай че остатъка от делението е 0 в стек-а записваме 0, в случай че е 1-ца записваме в стек-а 1-ца.
3. Някой може да питат защо записваме само 0 и 1 и дали има други остатъци, затова и това ще го обясня с малко примери :
- 5 делено на 2 ни дава 2 като цяла част и 1 остатък.
- 6 делено на 2 ни дава 3 като цяла част и 0 остатък.
- 7 делено на 2 ни дава 3 като цяла част и 1 остатък.
- 8 делено на 2 ни дава 4 като цяла част и 0 остатък.
И така нататък и така нататък.
4. Изкарваме елементите от стек-а с функцията pop() /* stack_pop(stack) */, като се има предвид че тя не принтира всичките елементи от стек-а, а само последния влязъл (Стек-а използва системата LIFO /Last in, first out/), затова трябва да направим цикъл, който да обходи целия стек, за да получим крайния резултат.
Надявам се да съм Ви бил полезен и мерси за вниманието :)