Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Код лаб / Notation

.py
Скачиваний:
0
Добавлен:
28.12.2024
Размер:
2.45 Кб
Скачать
from array import array
import ctypes
from LinkedList import LinkedList
from ArrayList import ArrayList

#OPERATORS = {'+': 1, '-': 1, '*': 2, '/': 2, '^': 3}
#FUNC = ['sin', 'cos']
OPERATORS = ArrayList()
OPERATORS.add('+')
OPERATORS.add('-')
OPERATORS.add('*')
OPERATORS.add('/')
OPERATORS.add('^')

OPERATORS_IND = ArrayList()
OPERATORS_IND.add(1)
OPERATORS_IND.add(1)
OPERATORS_IND.add(2)
OPERATORS_IND.add(2)
OPERATORS_IND.add(3)

FUNC = ArrayList()
FUNC.add('sin')
FUNC.add('cos')


#while el_top in OPERATORS and OPERATORS[element] <= OPERATORS[el_top]
class Stack():

  def __init__(self):
    self.head = None

  class Node:

    def __init__(self, data, next):
      self.data = data
      self.next = next

  def isEmpty(self):
    return self.head is None

  def push(self, element):
    self.head = self.Node(element, self.head)

  def pop(self):
    if self.isEmpty():
      print("None")
      return
    element = self.head.data
    self.head = self.head.next
    return element

  def peek(self):
    if not self.isEmpty():
      return self.head.data


def Notation(formula):
  stack = Stack()
  input = " "
  print("Tokens: ", end='')
  formula.out()
  for i in range(formula.size()):
    element = formula.get(i)
    if element in '1234567890':
      input += element
    elif FUNC.contains(element):
      stack.push(element)
    elif OPERATORS.contains(element):
      el_top = stack.peek()
      while OPERATORS.contains(el_top) and OPERATORS_IND.get(
          OPERATORS.indexOf(element)) <= OPERATORS_IND.get(
            OPERATORS.indexOf(el_top)):
        input += stack.pop()
        el_top = stack.peek()
      stack.push(element)
    elif element == '(':
      stack.push(element)
    elif element == ')':
      while stack.peek() != '(':
        if not stack.isEmpty():
          input += stack.pop()
        else:
          print("Error")
          return
      stack.pop()
  while not stack.isEmpty():
    if stack.peek() == '(':
      print("Error")
      return
    input += stack.pop()

  print(input)


#list = ArrayList()

#str = '7 + 8 * sin ( 5 + 2 )'

#list.split(str)

#Notation(list)

#test 5 * 6 - 7
#output 56*7-
#test ( 5 - 6 ) * 7
#output 56-7*
#test sin ( 5 * 6 )
#output 56*sin
#test 5 / 8 * ( 9 + 4 ) - 3 * ( 2 * 5 )
#output 58/94+*325**-
#test cos ( 8 / 9 * ( 5 + 4 * 7 ) )
#output 89/547*+*cos
#test ( 8 ^ 7 * 4 + 2 ) + 1 + 9 * 7 + 5
#output 87^4*2+1+97*+5+
#test 8 * sin ( 5 + 2 )
#output 7852+sin*+
Соседние файлы в папке Код лаб