-
Notifications
You must be signed in to change notification settings - Fork 0
/
tabela_simbolos.py
130 lines (86 loc) · 3.28 KB
/
tabela_simbolos.py
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
from item_tabela_simbolo import ItemTabelaSimbolo
class TabelaSimbolos:
_tamanho_array = 5
# iniciando a variavel com tamanho determiando de itens
_items = [None for x in range(_tamanho_array)]
def __init__(self):
pass
def print(self):
for i, no in enumerate(self._items):
if no:
print(i)
self._print_nome_recursive(no)
def _print_nome_recursive(self, item):
print(' - ' + item.nome)
if item._next:
self._print_nome_recursive(item._next)
def add(self, item):
# gerando chave
hash = self._convert_word_in_hash(item.nome)
i = self._convert_word_in_index(hash)
# salvando a chave no hash para ultilizar no metodo update
item._hash = hash
if self._items[i]:
item._next = self._items[i]
self._items[i] = item
else:
self._items[i] = item
"""
Buscando o item pelo nome do item
"""
def find(self, nome):
hash = self._convert_word_in_hash(nome)
return self._find_by_hash(hash)
def _find_by_hash(self, hash):
i = self._convert_word_in_index(hash)
item = self._items[i]
# pega o primeiro item que tenha aquele nome
# TODO verificar com o professor se esta certo, acho que tem que informar o escopo
while item != None:
if item._hash == hash:
return item
item = item._next
return None
def remove(self, item):
if item._hash:
# TODO analisar melhor
# Esse código provavelmete não faz o menor sentido hahaha
# uma que estamos trabalhando uma pilha, logo deveria remover o item do topo
# e caso quiser remover um nivel deveria remover até chegar ao nivel anterior
index = self._convert_word_in_index(item._hash)
root = self._items[index]
no_prev = None
while root != None:
if root._hash == item._hash:
break
no_prev = root
root = root._next
if no_prev:
no_prev._next = item._next
else:
# se não encontrou o prev é pq o item é o topo da pilha
self._items[index] = item._next
return True
# como esta recendo o item inteiro por paramentro é plausível que ele esteja na lista,
# caso não estaja é gerado Exception, pq ai tem algo muito errado
raise Exception('Item não encontrado para remover')
def update(self, item):
self.remove(item)
self.add(item)
pass
def _convert_word_in_index(self, hash: int):
return hash % self._tamanho_array
def _convert_word_in_hash(self, word: str):
charsAscii = []
for c in word:
charsAscii.append(ord(c))
return self._horner(charsAscii)
def _horner(self, chars):
polinomio = 37
if len(chars) == 1:
return chars[0]
else:
# fazendo multiplicação
# e passando o array de ASCII para a função recursiva
# passando um slice maior que o primeiro item do array
return chars[0] + polinomio * self._horner(chars[1:])