演算法學習 棧的應用之逆波蘭(字尾)表示式轉換

2021-08-14 20:57:01 字數 1647 閱讀 5260

已知一組中綴表示式,求其後主表示式

例:中綴表示式:(1+2)*3+(4+6)*(5*6)+7

字尾表示式:1 2+3*4 6+5 6** +7+

求解此問題通常有兩種方法:

1. 利用棧來儲存運算子,通過比較優先順序進行出入棧操作。

2. 將中綴表示式轉換為二叉樹,對二叉樹進行後序遍歷。

1.  數字直接輸出,不入棧。

2.  除右括號外,所有運算子入棧。

3.  入棧前與棧頂元素對比,如果棧頂運算子優先順序高,則不斷彈出,直至新棧頂為相對低優先順序運算子。

4.  遇到右括號時,不斷彈出棧頂直至最頂左括號彈出。輸出除左括號外所有運算子。(左括號也彈出,但不輸出)

5.  輸入結束時,應彈出並輸出所有運算子。(左括號只彈,不輸出)

#pragma once

#ifndef _stack_h

#define max 1000

typedef int elementtype;

struct mystack ;

typedef struct mystack *stack;

void push(elementtype e, stack s);

void pop(stack s);

int isempty(stack s);

int isfull(stack s);

void makeempty(stack s);

stack creatstack(int maxele);

void distroystack(stack s);

elementtype top(stack s);

#endif

// stack.cpp: 定義控制台應用程式的入口點。

//#include "stdafx.h"

#include "stack.h"

#include int arr[100];

mystack ss;

stack gs;

void push(elementtype e, stack s)

}void pop(stack s)

int isempty(stack s)

int isfull(stack s)

void makeempty(stack s)

s->top = 0;

}stack creatstack(int maxele)

void distroystack(stack s)

elementtype top(stack s)

return 0;

}int main()

push(c, &ss);

} if (c == '*' || c == '/')

push(c, &ss);

} if (c == '(')

if (c == ')')

} if (c == 10)

}} }

return 0;

}

棧的應用之逆波蘭計算器練習

public class operation return result 逆波蘭表示式,在逆波蘭記法中,所有操作符置於運算元的後面,所以逆波蘭表示又稱字尾表示式。逆波蘭記法不需要括號來標識操作符的優先順序。將中綴表示式轉後字尾表示式需要用到兩個棧,乙個是符號棧,乙個是結果棧。先將表示式轉成list型...

資料結構 棧應用之逆波蘭表示式(字尾表示式)

逆波蘭表示式含義我就不做贅述了,摘自百科上的一段話 逆波蘭表示式又叫做字尾表示式。在通常的表示式中,二元運算子總是置於與之相關的兩個運算物件之間,這種表示法也稱為中綴表示。波蘭邏輯學家j.lukasiewicz於1929年提出了另一種表示表示式的方法,按此方法,每一運算子都置於其運算物件之後,故稱為...

逆波蘭表示式 遞迴 演算法學習

問題 逆波蘭表示式是一種把運算子前置的算術表示式,例如普通的表示式2 3的逆波蘭表示法為 23.逆波蘭 表示式的優點是運算子之間不必有優先順序關係,也不必用括號改變運算次序,例如 2 3 4的逆波蘭表示法為 234.本體求解逆波蘭表示式的值,其中運算子包括 四個 輸入輸入為一行,其中運算子和運算數之...