codevs2574 波兰表达式
對于 加、減、乘、除這種四則運算的表達式,我們使用的是先乘除、后加減的從左到右的順序進行運算,如果要指定特定的順序,就要增加括號進行表達,比如 (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 OutputAB-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 波兰表达式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: javascript-模板方法模式-提示
- 下一篇: 关闭 Sublime Text 3 自动