2013-11-21 3 views
4

Чтение на стеках, поэтому я опробовал это упражнение Infix для Postfix (найдено here). Вам придется немного прокрутить, чтобы увидеть их код. Я старался оставаться верным своей первоначальной реализации, насколько это возможно.Почему мой список не заполняется? IndexError: List Out of Range

Мой код: http://pastebin.com/dG4Ku14n

Я получаю сообщение об ошибке в строке 18 (где я определяю переменную PEEK). Он говорит, что список вне диапазона, но я не должен был называть этот список еще? Не следует ли это просто хранить в переменной, и фактическая ошибка должна появиться позже в документе, когда я использую «prec [peek]» в строке 49?

Я уверен, что этот код более fubar, чем я понимаю. Любая помощь будет оценена по достоинству. Должен ли я начать все сначала?

Короткая версия:

peek = operator_stack[len(operator_stack)-1] 
for element in infix: 
    if: 
     #code 
    else: 
    while not operator_stack and prec[peek] >= prec[element]: 
     output_queue.append(operator_stack.pop()) 
    operator_stack.append(element) 

Ожидаемый результат:

A B * C + D * 
+2

Пожалуйста уменьшить свой код на [короткий, самодостаточного, правильный пример] (http://sscce.org/) и включить его непосредственно в вопрос. –

+0

, пожалуйста, напишите свой ожидаемый результат –

+0

добавил ожидаемый результат –

ответ

3

К сожалению, вы operator_stack список пуст поэтому она возвращает IndexError BTW, если вы хотите, чтобы найти последний элемент использования списка и сделать обязательно доведите его до None, если его пустая:

Таким образом, использование:

peek = operator_stack[-1] if operator_stack else None

вместо:

peek = operator_stack[len(operator_stack)-1]

Также при отладке кода ясно видно из комментариев, что эти строки в:

линия 49: while not operator_stack and prec[peek] >= prec[element]:

линия 59: while not operator_stack:

должно выглядеть на самом деле:

линии 49: while operator_stack and prec[peek] >= prec[element]:

линия 59: while operator_stack:

Наконец добавить, если заявление, чтобы проверить, если peek является None

Короткий вариант будет

#line 18 
peek = operator_stack[-1] if operator_stack else None 
#line 49 
if peek is not None: 
    while operator_stack and prec[peek] >= prec[element]: 

      #Append the pop'd element of the operator stack to the 
      #output_queue list. 
      output_queue.append(operator_stack.pop()) 

    #Append whatever is left (+,-,*,/) to the operator stack 
    operator_stack.append(element) 

    #line 59 
    while operator_stack: 
      #Append the last element in the stack until the stack is empty. 
      output_queue.append(operator_stack.pop()) 

Если вы doubt, что while operator_stack: значит, увидеть этот простой пример:

>>> a = [2,5,6] 
>>> while a: # a is not empty right? 
...  print 2 # so print 2 
...  break # and break 
2 
+1

Не поможет, потому что стек пуст –

+0

@MarkRansom только что заметил, что –

+0

Как насчет 'peek = (operator_stack [-1:] + [None]) [0]'? –

Смежные вопросы