codevs2574 波蘭表示式

2022-09-06 14:27:21 字數 1843 閱讀 5686

題目描述 description

對於 加、減、乘、除這種四則運算的表示式,我們使用的是先乘除、後加減的從左到右的順序進行運算,如果要指定特定的順序,就要增加括號進行表達,比如 (a+b)*c , a+(f-(a+y))*(b-c)/d 。

除了上述表達方式之外,在2023年,波蘭邏輯學家lukasiewicz提出一種不用括號的邏輯符號體系,後來人們稱之為波蘭表示法,波蘭表示式的特點是運算子位於運算物件的後面,因此稱為字尾表示。在對波蘭表示式進行運算,嚴格按照自左至右的順序進行。下面給出一些表示式及其相應的波蘭表示式。

普通表示式

波蘭表示式

a-bab-

(a-b)*c+d

ab-c*d+

(b+c)/(a-d)

bc+ad-/

【普通表示式】

普通表示式 (exp) 定義如下:

1、  大寫字母 a,b,c,d …z  是 exp

2、  exp+exp , exp–exp , exp*exp , exp/exp 是exp

3、  (exp) 是exp

普通表示式使用習慣性的括號優先。先乘除後加減的順序進行運算。

【普通表示式轉換成波蘭表示式】

普通表示式可以按照運算順序構建二叉樹然後轉換成波蘭表示式。

例如:(a-b)*c+d*e

對應的運算二叉樹如下:

然後對該二叉樹進行後序遍歷,就可以得到波蘭表示式:  ab-c*de*+

輸入描述 input description

輸入包含一行,50個字元以內,代表普通表示式

輸出描述 output description

輸出包含一行,代表轉換後的波蘭表示式

樣例輸入 sample input

(a-b)*c+d*e

樣例輸出 sample output

ab-c*de*+

資料範圍及提示 data size & hint

輸入包含一行,50個字元以內

/*

簡單的表示式分析

*/#include

#include

#include

#include

#include

#define ll int

#define fo(i,l,r) for(int i = l;i <= r;i++)

#define fd(i,l,r) for(int i = r;i >= l;i--)

using

namespace

std;

const

int maxn = 1050

;ll read();

while(ch>='

0'&&ch<='

9');

return x*f;

}char

s[maxn],bo[maxn];

intcnt,rt;

struct

exp_t

int build(int l,int

r) fo(i,l,r)

}if(c1 < 0) c1 =c2;

if(c1 < 0) return build(l+1,r-1

); u = ++nc;

lch[u] = build(l,c1-1

); rch[u] = build(c1+1

,r);

op[u] =s[c1];

return

u; }

void dfs(int

x)

void

get_b()

}e;int

main()

波蘭表示式 逆波蘭表示式

中綴表示式是最常見的運算表示式,如 3 5 2 6 1 波蘭表示式又稱為字首表示式,它是由中綴表示式經過一定的方式轉換來的 比如中綴表示式為 3 5x 2 6 1 對應的字首表示式為 3 x 5 2 6 1 對於中綴表示式從右向左遍歷轉換為字首表示式,中途要是用棧進行儲存 轉換規則如下 波蘭表示式 ...

波蘭表示式與逆波蘭表示式

2018年09月03日 11 29 15 jitwxs 閱讀數 70 標籤 波蘭 字首 更多 個人分類 演算法與資料結構 常見的算術表示式,稱為中綴表示式,例如 5 6 4 2 3波蘭表示式也稱為字首表示式,以上面的例子為例,其波蘭表示式為 5 6 4 2 3中綴表示式轉換字首表示式的操作過程為 1...

波蘭表示式和逆波蘭表示式

題目 根據逆波蘭表示法,求表示式的值。有效的運算子包括 每個運算物件可以是整數,也可以是另乙個逆波蘭表示式。說明 示例 1 輸入 2 1 3 輸出 9 解釋 該算式轉化為常見的中綴算術表示式為 2 1 3 9 示例 2 輸入 4 13 5 輸出 6 解釋 該算式轉化為常見的中綴算術表示式為 4 13...