Уведомления

Группа в Telegram: @pythonsu

#1 Ноя. 19, 2010 20:20:46

Brauny74
От:
Зарегистрирован: 2010-11-19
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

Реализация стека

Программирую на Python всего лишь второй день.
Хочу реализовать стек с помощью соответвующего класса.
Вот код:

class Stack:
def __init__(self):
self.TopP=0
self.S = list()
def Push(self, x):
self.TopP=self.TopP+1
self.S.append(x)
def Pop(self):
if TopP>0:
c=self.S[TopP]
self.TopP=self.TopP-1
else:
c=int(c)
c=0
return c
def Top():
return self.S[TopP]
def IsEmpty():
return self.TopP==0
В коде программы вызываю метод Push, примерно так (X = строковая переменная):
St=Stack()
St.Push(x[i])
Получаю следующую ошибку:
Traceback (most recent call last):
File "C:\PythonTProg\Stack.py", line 71, in <module>
c=Polish(X)
File "C:\PythonTProg\Stack.py", line 42, in Polish
St.Push(X[i])
TypeError: unbound method Push() must be called with Stack instance as first argument (got str instance instead)
Такое чувство, что я где-то протупил. Объясните, где?



Офлайн

#2 Ноя. 19, 2010 20:47:20

Soteric
От:
Зарегистрирован: 2010-09-19
Сообщения: 352
Репутация: +  20  -
Профиль   Отправить e-mail  

Реализация стека

У меня этот код работает. Наверное будет лучше привести и код и вызов как он есть, а не “примерно так”.



Офлайн

#3 Ноя. 19, 2010 20:48:20

o7412369815963
От:
Зарегистрирован: 2009-06-17
Сообщения: 1986
Репутация: +  32  -
Профиль   Отправить e-mail  

Реализация стека

половина класса робит:

# coding: utf8

# ...

s = 'hello'
st = Stack()
st.Push(s[1])

print st.S
# ['e']

Отредактировано (Ноя. 19, 2010 20:48:49)

Офлайн

#4 Ноя. 19, 2010 20:52:43

Brauny74
От:
Зарегистрирован: 2010-11-19
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

Реализация стека

Soteric
def Polish(X):
St=Stack
for i in range(0,len(X)):
if (X[i]>='0')or(X[i]<='9'):
St.Push(X[i])
elif X[i]=='+':
a=St.Pop()
b=St.Pop()
St.Push(int(a)+int(b))
elif X[i]=='-':
a=St.Pop()
b=St.Pop()
St.Push(int(a)-int(b))
elif X[i]=='*':
a=St.Pop()
b=St.Pop()
St.Push(int(a)*int(b))
return St.Top
Вот, вы просили. Да, расчёт в польской записи.



Офлайн

#5 Ноя. 19, 2010 20:57:58

Soteric
От:
Зарегистрирован: 2010-09-19
Сообщения: 352
Репутация: +  20  -
Профиль   Отправить e-mail  

Реализация стека

St=Stack
В конце не хватает скобок
Stack()
поэтому переменная St в данном случае выступает не объектом класса Stack, а ссылкой на сам класс. Соответственно попытка St.Push() воспринимается здесь как попытка вызвать метод класса (classmethod), который не помечен таковым.



Офлайн

#6 Ноя. 19, 2010 21:20:41

Brauny74
От:
Зарегистрирован: 2010-11-19
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

Реализация стека

Soteric
Спасибо.



Отредактировано (Ноя. 20, 2010 11:28:57)

Офлайн

#7 Ноя. 20, 2010 12:00:59

fata1ex
От:
Зарегистрирован: 2009-07-11
Сообщения: 732
Репутация: +  52  -
Профиль   Отправить e-mail  

Реализация стека

Советую почитать Style Guide, чтобы со второго же дня отучаться писать названия функций/переменных капсом.



Отредактировано (Ноя. 20, 2010 12:01:23)

Офлайн

#8 Ноя. 20, 2010 12:36:14

ZAN
От:
Зарегистрирован: 2007-06-10
Сообщения: 403
Репутация: +  10  -
Профиль   Отправить e-mail  

Реализация стека

Brauny74
Хочу реализовать стек с помощью соответвующего класса.
А чем не устраивает list?
>>> a = []
>>> a.append(1)
>>> a.append(2)
>>> a.pop()
2
>>> a.pop()
1



Офлайн

#9 Ноя. 21, 2010 10:55:47

Brauny74
От:
Зарегистрирован: 2010-11-19
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

Реализация стека

Это для демонстрации синтаксиса определения класса в Python. Выбрал структуру с не очень сложной реализацией.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version