-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathpilha.hpp
More file actions
141 lines (117 loc) · 2.97 KB
/
pilha.hpp
File metadata and controls
141 lines (117 loc) · 2.97 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
#pragma once
#include <stdint.h>
#include <stdexcept>
/**
* @brief Classe template para implementação de uma Pilha (estrutura LIFO).
*
* @tparam T Tipo de dado armazenado na pilha.
*/
template <class T>
class Pilha {
public:
/**
* @brief Construtor da pilha com capacidade personalizada.
*
* Inicializa a pilha com a capacidade especificada pelo usuário.
*
* @param capacidade A capacidade máxima da pilha.
*/
Pilha(size_t capacidade);
/**
* @brief Destrutor da pilha.
*
* Libera os recursos alocados dinamicamente.
*/
~Pilha();
/**
* @brief Insere um novo elemento no topo da pilha.
*
* @param valor Valor a ser empilhado.
* @throws std::runtime_error Se a pilha estiver cheia.
*/
void empilhar(const T& valor);
/**
* @brief Remove e retorna o elemento do topo da pilha.
*
* @return Elemento removido do topo.
* @throws std::runtime_error Se a pilha estiver vazia.
*/
T desempilhar();
/**
* @brief Acessa o elemento do topo da pilha.
*
* @return Referência ao elemento no topo.
* @throws std::runtime_error Se a pilha estiver vazia.
*/
T& topo();
/**
* @brief Acessa o elemento do topo da pilha (versão constante).
*
* @return Referência constante ao elemento no topo.
* @throws std::runtime_error Se a pilha estiver vazia.
*/
const T& topo() const;
/**
* @brief Verifica se a pilha está vazia.
*
* @return true Se a pilha estiver vazia.
* @return false Caso contrário.
*/
bool esta_vazia() const;
/**
* @brief Verifica se a pilha está cheia.
*
* @return true Se a pilha estiver cheia.
* @return false Caso contrário.
*/
bool esta_cheia() const;
const size_t capacidade; /**< Capacidade máxima da pilha. */
private:
size_t tamanho; /**< Número atual de elementos na pilha. */
T* dados; /**< Ponteiro para o array de elementos. */
public:
// Necessário apenas para os testes automatizados.
// ---
Pilha(const Pilha&) = delete;
Pilha& operator=(const Pilha&) = delete;
// ---
};
template <class T>
Pilha<T>::Pilha(size_t capacidade) : capacidade(capacidade) {
dados = new T[capacidade];
tamanho = 0;
}
template <class T>
Pilha<T>::~Pilha() {
delete[] dados;
}
template <class T>
void Pilha<T>::empilhar(const T& valor) {
if (esta_cheia()) throw std::runtime_error("Pilha cheia");
dados[tamanho] = valor;
tamanho++;
}
template <class T>
T Pilha<T>::desempilhar() {
if(esta_vazia()) throw std::runtime_error("Pilha cheia");
tamanho--;
return dados[tamanho];
}
template <class T>
T& Pilha<T>::topo() {
if(esta_vazia()) throw std::runtime_error("Pilha cheia");
return dados[tamanho - 1];
}
template <class T>
const T& Pilha<T>::topo() const {
if (esta_vazia()) throw std::runtime_error("Pilha vazia");
return dados[tamanho - 1];
}
template <class T>
bool Pilha<T>::esta_vazia() const {
return tamanho == 0;
}
template <class T>
bool Pilha<T>::esta_cheia() const {
return tamanho == capacidade;
}