Implementando Uma Pilha
Como o nosso avaliador de expressões precisa de uma pilha para avaliar as expressões, vamos primeiro implementar uma pilha.
Cabeçalho C
Agora vamos fazer um cabeçalho da linguagem C. Nossa pilha vai guardar double
,
já que é o que a calculadora precisa. Vamos declarar duas funções básicas de
pilhas: push
e pop
, além de uma função para liberar memória. Elas vão
receber um ponteiro duplo, mas não se assuste, o ponteiro de dentro representa a
pilha em si, que pode ser NULL
, e o ponteiro de fora serve para modificarmos o
endereço do ponteiro de dentro, e não pode ser NULL
.
Arquivo stack.h
:
#ifndef STACK_H
#define STACK_H
typedef double stack_data;
struct stack {
stack_data data;
struct stack *next;
};
void stack_push(struct stack **stack, stack_data data);
int stack_pop(struct stack **stack, stack_data *data);
void stack_free(struct stack **stack);
#endif
Agora, vamos salvar nossa ideia de pilha em um commit.
git add .
git status
git commit -m 'ideia de stack adicionada'
Mas hmmmm, talvez fosse interessante salvar esse projeto em um serviço como o
GitHub. Por isso, eu criei um repositório remoto com a URL
https://github.com/petcomputacaoufrgs/rpn-calc. No repositório do GitHub, já
tem uma licença e um arquivo de README
. Se você utilizar um remoto, lembre de
substituir a URL por uma adequada. Vamos salvar esse remoto:
git remote add github git@github.com:petcomputacaoufrgs/rpn-calc.git
Note que eu estou usando um endereço SSH, mas você poderia usar um endereço
HTTPS como https://github.com/petcomputacaoufrgs/rpn-calc.git
.
Como o GitHub usa main
como branch principal, precisamos renomear master
:
git branch -m main
Agora vamos executar um push
, passando a flag -u
, e assim só vamos
precisar especificar o repositório remoto e a branch uma vez para essa
branch:
git push -u github main
Oopsss... Eu criei o repositório remoto com licença e README
. Primeiro vamos
ter que executar git pull
. Precisamos usar a flag --set-upstream
para
porque o push -u
falhou (-u
e --set-upstream
são equivalentes).
git pull --set-upstream github main
Oopsssss... Esse erro aconteceu porque as histórias dos repositórios não
têm conexão. Basta usar a flag --allow-unrelated-histories
.
git pull --allow-unrelated-histories
Então, abrir-se-á um editor de texto perguntando por uma mensagem de commit. Basta editar, salvar, e sair.
Pronto, agora podemos executar git push
tranquilamente.
git push
Arquivo de Implementação C
Agora, vamos implementar a pilha.
Arquivo stack.c
:
#include "stack.h"
#include <stdlib.h>
void stack_push(struct stack **stack, stack_data data)
{
struct stack *new_node = malloc(sizeof(struct stack));
if (new_node == NULL) {
abort();
}
new_node->data = data;
new_node->next = *stack;
*stack = new_node;
}
int stack_pop(struct stack **stack, stack_data *data)
{
int success = 0;
struct stack *node_ptr = *stack;
if (node_ptr != NULL) {
success = 1;
*stack = node_ptr->next;
if (data != NULL) {
*data = node_ptr->data;
}
free(node_ptr);
}
return success;
}
void stack_free(struct stack **stack)
{
while (stack_pop(stack, NULL)) {}
}
Vamos ver se não ocorre algum erro de compilação (no Linux):
gcc -o stack.o -c stack.c
Perfeito, não ocorre.
Agora vamos fazer um commit.
git add .
git status
git commit -m 'implementação da stack'
E publicar a mudança:
git push