日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

codevs2574 波兰表达式

發布時間:2025/3/14 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 codevs2574 波兰表达式 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目描述?Description

對于 加、減、乘、除這種四則運算的表達式,我們使用的是先乘除、后加減的從左到右的順序進行運算,如果要指定特定的順序,就要增加括號進行表達,比如 (A+B)*C , A+(F-(A+Y))*(B-C)/D 。

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

普通表達式

波蘭表達式

A-B

AB-

(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<iostream> #include<cstdio> #include<string> #include<cstring> #include<algorithm> #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(){ll x=0,f=1;char ch=getchar();while(!(ch>='0'&&ch<='9')){if(ch=='-')f=-1;ch=getchar();};while(ch>='0'&&ch<='9'){x=x*10+(ch-'0');ch=getchar();};return x*f; } char s[maxn],bo[maxn]; int cnt,rt; struct exp_t{int lch[maxn],rch[maxn];char op[maxn];int nc;void cler(){memset(lch,0,sizeof(lch));memset(rch,0,sizeof(rch));nc = 0;}int build(int l,int r){int c1 = -1,c2 = -1,p=0;int u;if(l == r){u = ++nc;lch[u] = rch[u] = 0;op[u] = s[l];return u;}fo(i,l,r){switch(s[i]){case '(':p++;break;case ')':p--;break;case '+':case '-':if(!p) c1 = i;break;case '*':case '/':if(!p) c2 = i;break;}}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){if(lch[x]) dfs(lch[x]);if(rch[x]) dfs(rch[x]);bo[++cnt] = op[x];}void get_b(){cnt = 0;dfs(rt);} }e; int main(){scanf("%s",s+1);e.cler();rt = e.build(1,strlen(s+1));e.get_b();fo(i,1,cnt) cout<<bo[i];return 0; }

?

轉載于:https://www.cnblogs.com/hyfer/p/6002820.html

總結

以上是生活随笔為你收集整理的codevs2574 波兰表达式的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。