Câu hỏi:

30/09/2024 172

Nhiệm vụ: Viết chương trình tính giá trị của biểu thức số học với biểu thức đầu vào là biểu thức hậu tố.

Yêu cầu: Viết chương trình tính giá trị biểu thức số học dùng hàm chuyển biểu thức inFixtoPostfix(). Chạy chương trình trên.

Quảng cáo

Trả lời:

verified
Giải bởi Vietjack

Sử dụng inFixtoPostfix() để chuyển biểu thức dạng trung tố sang dạng hậu tố.

Sử dụng hàm calPostfix() để tính giá trị biểu thức dạng hậu tố.

Hàm tính b op a, với a, b là toán hạng, op là toán tử:

def calculate(a, b, op): if op '+': return b+a

elif opa return b-a

elif op ==

return b*a

elif op '/':

return b/a

else:

return b**a

Hàm tính giá trị biểu thức dạng hậu tố:

def calPostfix(s): stack initStack() for op in s:

if not isoperator(op): push(stack, op)

else:

a = int(pop(stack)) b= int(pop(stack))

d = calculate(a, b, op) push(stack, d)

k = pop(stack)

return k

k = calPostfix ('245-+6*') print(k)

k = calPostfix ('243+*5-') print(k)

#Thêm tí

hạng vào stack

#Kiếm tr. nếu op là toán tử #Lấy toán hạng a ra khỏi stack

#Lấy toán hạng b ra khỏi stack

#Gọi calculate để thực hiện phép tính b op a #Thêm d vào stack

#Lấy phần tử còn lại trong stack

#Trả về kết quả

Bình luận


Bình luận

CÂU HỎI HOT CÙNG CHỦ ĐỀ

Lời giải

Sử dụng hàm isOperator() để kiểm tra kí tự là toán tử, hàm getPriority() để xác định độ ưu tiên của toán tử, hàm inFixtoPostfix() để chuyển biểu thức dạng trung tố sang dạng hậu tố

Hàm kiểm tra kí tự có phải là toán tử hay không:

def isoperator (c):

return c in '+-*/^'

Hàm kiểm tra độ ưu tiên của toán tử:

def getPriority (op):

if op '+' or op ==

return 1

elif op ==

return 2

elif op:

else:

return 3

return 0

or op '/':

chuyển biểu thức dạng trung tổ sang dạng hậu tố:

#Hàm chuyển biểu thức trung tổ sang hậu tổ

def inFixtoPostfix(infix):

infix infix.replace('[', '(').replace('1', ')').replace('(', '(').

Replace (‘}’, ‘)’)

Lace('}', ')')

stack initStack()

postfix = ""

for c in infix:

if c =='':

continue

#Bỏ qua khoảng trắng

#Nếu kí tự là toán hạng, thêm vào chuỗi hậu tố

if c.isalpha() or c.isdigit():

postfix += c

#Nếu kí tự là '(', thêm vào stack

elif (':

push(stack, c)

#Nếu kí tự là ')'

elif c == ')': #Lấy ra khỏi stack và thêm vào postfix cho đến khi gặp ( while not isEmptyStack(stack) and top (stack) != '(':

postfix += pop(stack)

pop(stack)

elif isOperator (c): #Toán tử

if c != '^':

while not isEmptyStack(stack) and getPriority(c) <= getPriority(top(stack)): postfix + pop (stack)

postfix + pop(stack)

push(stack, c)

stack): áng tạo

while not isEmptyStack (stack):

postfix += pop(stack)

return postfix

infix = '2* (4 + 3) - 5'

postfix = inFixtoPostfix (infix)

print("Biểu thức hậu tố: " postfix)

infix = '2^2^3'

postfix = inFixtoPostfix(infix)

print("Biểu thức hậu tố: ", postfix)

Lời giải

1. Sử dụng lệnh inFix = inFix[:-1] để đảo ngược chuỗi biểu thức trung tố. Ví dụ, *(2 – 7/3) * (2/8 – 4)" được chuyển thành ")4–8/2(*)3/7–2(".

2. Thay thế các dấu đóng ngoặc thành dấu mở ngoặc và dấu mở ngoặc thành dấu đóng ngoặc trong chuỗi biểu thức đã đảo ngược trong bước 1.

Ví dụ, chuỗi ")4–8/2(*)3/7−2(" được chuyển thành "(4 – 8/2) * (3/7 – 2)".

3. Gọi hàm inFixtoPostfix() chuyển từ biểu thức dạng trung tố sang dạng hậu tố. 4. Đảo ngược chuỗi biểu thức kết quả của 3.

5. Kết thúc.

Lời giải

Bạn cần đăng ký gói VIP ( giá chỉ từ 199K ) để làm bài, xem đáp án và lời giải chi tiết không giới hạn.

Nâng cấp VIP

Vietjack official store
Đăng ký gói thi VIP

VIP +1 - Luyện thi tất cả các đề có trên Website trong 1 tháng

  • Hơn 100K đề thi thử, đề minh hoạ, chính thức các năm
  • Với 2tr+ câu hỏi theo các mức độ Nhận biết, Thông hiểu, Vận dụng
  • Tải xuống đề thi [DOCX] với đầy đủ đáp án
  • Xem bài giảng đính kèm củng cố thêm kiến thức
  • Bao gồm tất cả các bậc từ Tiểu học đến Đại học
  • Chặn hiển thị quảng cáo tăng khả năng tập trung ôn luyện

Mua ngay

VIP +3 - Luyện thi tất cả các đề có trên Website trong 3 tháng

  • Hơn 100K đề thi thử, đề minh hoạ, chính thức các năm
  • Với 2tr+ câu hỏi theo các mức độ Nhận biết, Thông hiểu, Vận dụng
  • Tải xuống đề thi [DOCX] với đầy đủ đáp án
  • Xem bài giảng đính kèm củng cố thêm kiến thức
  • Bao gồm tất cả các bậc từ Tiểu học đến Đại học
  • Chặn hiển thị quảng cáo tăng khả năng tập trung ôn luyện

Mua ngay

VIP +6 - Luyện thi tất cả các đề có trên Website trong 6 tháng

  • Hơn 100K đề thi thử, đề minh hoạ, chính thức các năm
  • Với 2tr+ câu hỏi theo các mức độ Nhận biết, Thông hiểu, Vận dụng
  • Tải xuống đề thi [DOCX] với đầy đủ đáp án
  • Xem bài giảng đính kèm củng cố thêm kiến thức
  • Bao gồm tất cả các bậc từ Tiểu học đến Đại học
  • Chặn hiển thị quảng cáo tăng khả năng tập trung ôn luyện

Mua ngay

VIP +12 - Luyện thi tất cả các đề có trên Website trong 12 tháng

  • Hơn 100K đề thi thử, đề minh hoạ, chính thức các năm
  • Với 2tr+ câu hỏi theo các mức độ Nhận biết, Thông hiểu, Vận dụng
  • Tải xuống đề thi [DOCX] với đầy đủ đáp án
  • Xem bài giảng đính kèm củng cố thêm kiến thức
  • Bao gồm tất cả các bậc từ Tiểu học đến Đại học
  • Chặn hiển thị quảng cáo tăng khả năng tập trung ôn luyện

Mua ngay