حل عبارت ریاضی با پشته در پایتون

حل عبارت ریاضی با پشته در پایتون
حل عبارت ریاضی با پشته در پایتون

حل عبارت ریاضی با پشته در پایتون

از مسائل مهم ساختمان داده همیشه از پشته ها می توان نام برد؛ پشته ها یک نوع ساختمان داده ای هستند که برای نگهداری داده ها استفاده می شوند و فرآیند ورود و خروج خاصی دارند.

به نحوه ورود و خروج داده ها از پشته Lifo می گوییم.

در این نوشته با حل عبارت های ریاضی معمولی یا infix به کمک پشته ها (دو پشته) با زبان برنامه نویسی پایتون می پردازیم.

همراه ما باشید.

 

خواندن نوشته های زیر نیز به شما توصیه می شود:

 

حل عبارت ریاضی با پشته در پایتون

با استفاده از کد زیر به کمک پشته ها یک عبارت میانوندی را با زبان برنامه نویسی پایتون برای شما حل می کنیم:

def isOperator(c):
    if c != "": return (c in "+-*/")
    else: return False

def checkPriority(c):
    if c in "+-": return 0
    if c in "*/": return 1
    
def isNumber(c):
    if c != "": return (c in "0123456789.")
    else: return False

def runOperator(op, number1, number2):
    if op == "+": return str(float(number1) + float(number2))
    if op == "-": return str(float(number1) - float(number2))
    if op == "*": return str(float(number1) * float(number2))
    if op == "/": return str(float(number1) / float(number2))

def Calculation(expr):
    expr = list(expr)
    stack_o = list()
    stack_n = list()
    num = ""
    while len(expr) > 0:
        c = expr.pop(0)
        if len(expr) > 0: d = expr[0]
        else: d = ""
        if isNumber(c):
            num += c
            if not isNumber(d):
                stack_n.append(num)
                num = ""
        elif isOperator(c):
            while True:
                if len(stack_o) > 0: top = stack_o[-1]
                else: top = ""
                if isOperator(top):
                    if not checkPriority(c) > checkPriority(top):
                        number2 = stack_n.pop()
                        op = stack_o.pop()
                        number1 = stack_n.pop()
                        stack_n.append(runOperator(op, number1, number2))
                    else:
                        stack_o.append(c)
                        break
                else:
                    stack_o.append(c)
                    break
        elif c == "(":
            stack_o.append(c)
        elif c == ")":
            while len(stack_o) > 0:
                c = stack_o.pop()
                if c == "(":
                    break
                elif isOperator(c):
                    number2 = stack_n.pop()
                    number1 = stack_n.pop()
                    stack_n.append(runOperator(c, number1, number2))

    while len(stack_o) > 0:
        c = stack_o.pop()
        if c == "(":
            break
        elif isOperator(c):
            number2 = stack_n.pop()
            number1 = stack_n.pop()
            stack_n.append(runOperator(c, number1, number2))

    return stack_n.pop()


# For Exam : ((4*2)-(3-1))/(8-3*2) = 3.0
my_input = input("Enter String For Calculation : ")
print(Calculation(my_input))

 

با توجه به کد بالا به عنوان مثال یک ورودی مثل ورودی زیر می دهیم:

((4*2)-(3-1))/(8-3*2)

و در صورتی که کد بالا را درست اجرا کنید باید خروجی 3 را مشاهده کنید.

 

توضیحات – اجرای عبارت میانوندی با پشته در پایتون

  • در کد بالا از دو پشته با نام های stack_o و stack_n استفاده شده است که از پشته ی stack_n به عنوان پشته ای برای نگهداری اعداد و از پشته ی stack_o برای نگهداری عملگرها استفاده کردیم.
  • کد بالا با زبان برنامه نویسی پایتون نوشته شده است.
  • در کد بالا عبارت ریاضی میاوندی را می توانید به صورت دستی وارد کنید و هر بار یک عبارت خاص اجرا کنید و در واقع ورودی را از کاربر خواهید گرفت.
  • در کد بالا توابع زیر را تعریف کرده ایم:
    • isOperator
    • checkPriority
    • isNumber
    • runOperator
    • Calculation
  • این برنامه اعداد اعشاری را نیز محاسبه می کند.

 

کتاب رایگان پایتون:

 

اگر روش های بهتری برای حل عبارت های میانوندی با کمک زبان برنامه نویسی پایتون در اختیار دارید در بخش نظرات همین نوشته برای ما ارسال کنید.

موفق باشید.

برای امتیاز به این نوشته کلیک کنید!
[کل: 0 میانگین: 0]