За да не си играя със стекове и допълнителни опашки, просто си направих една допълнителна функция (почти същата като функцията queue_deque), която вместо първия елемент в опашката, да принтира последния
Ето я и нея:
int queue_deque_end(Queue *queue)
{
if(queue->head > queue->tail)
{
return -1;
}
int result = (queue->items)[queue->tail];
queue->tail--;
return result;
}
А ето и как съм я използвал в зададената програма:
#include <stdio.h>
#include <stdlib.h>
#define INITIAL_CAPACITY 5
typedef struct Queue Queue;
struct Queue
{
int *items;
int head;
int tail;
int capacity;
};
Queue *queue_create();
void queue_enqueue(Queue *queue, int element);
int queue_deque(Queue *queue);
int main()
{
Queue *queue = queue_create();
int digit = 0;
char c;
while((c=getchar()) != EOF)
{
if(c>='0' && c<='9')
{
digit = 10*digit + (c - '0');
}
}
do
{
queue_enqueue(queue, digit%2);//vkarvam v opashkata ostatykyt ot chisloto, vzeto ot vhodniq fail, pri delenie na 2
digit /=2;
}while(digit != 0);
while(queue->head < queue->tail)
{
printf("%d", queue_deque_end(queue));//tuk izpolzvam dopylnitelno napravenata funkciq, koqto na praktika prevryshta opashkata vyv stek, tyj kato vryshta chisloto na kraq na opashkata (LIFO)
}
printf("%d\n", queue_deque_end(queue)); //tova tuk e samo za da izglezhda izhodyt po-dobre
return 0;
}
Queue *queue_create()
{
Queue *queue = (Queue *)malloc(sizeof(Queue));
queue->items = (int *)malloc(sizeof(int) * INITIAL_CAPACITY);
queue->head = -1;
queue->tail = -1;
queue->capacity = INITIAL_CAPACITY;
return queue;
}
void queue_enqueue(Queue *queue, int element)
{
if(queue->head == -1)
{
queue->head++;
}
if(queue->tail + 1 == queue->capacity)
{
queue->items = (int *)realloc(queue->items, 2 * queue->capacity * sizeof(int));
queue->capacity *= 2;
}
queue->tail++;
(queue->items)[queue->tail] = element;
}
int queue_deque(Queue *queue)
{
if(queue->head > queue->tail)
{
return -1;
}
int result = (queue->items)[queue->head];
queue->head++;
return result;
}
int queue_deque_end(Queue *queue) //s tazi funkciq izvazhdam poslednoto chislo, vlqzlo v opashkata
{
if(queue->head > queue->tail)
{
return -1;
}
int result = (queue->items)[queue->tail];
queue->tail--;
return result;
}