二叉樹是表示式處理的常用工具。找到"最後計算"的運算子(它是整棵表示式樹的根),然後遞迴處理。
遞迴處理成樹是表示式處理的乙個重要方式。這裡我只記錄和理解了lrj
lrjlr
j老師的**(抄了一遍,自己還沒動手自己寫過。不過目前這不是重點內容,所以到此為止。
個位數加減乘除成表示式樹
const
int maxn =
1000
;int lch[maxn]
,rch[maxn]
;char op[maxn]
;int nc=0;
intbuild_tree
(char
* s,
int x,
int y)
for(
int i=x;i//找當前表示式的最後計算的運算子(肯定不在最後,並且在括號外
if(c1<
0)c1=c2;
//找不到括號外的加減號,用乘除號
if(c1<0)
return
build_tree
(s,x+
1,y-1)
;//找不到其他符號:整個表示式被一對括號括起來
u=++nc;
lch[u]
=build_tree
(s,x,c1)
; rch[u]
=build_tree
(s,c1+
1,y)
; op[u]
=s[c1]
;return u;
}
引入一道例題,uva
12219
uva12219
uva122
19對於一棵二叉樹(字串作為節點)的括號表示式,你需要簡化這個表示式,使得相同子樹返回子樹編號。
這裡採用遞迴建樹,用map
mapma
p記錄子樹編號,如果存在就使得新建子樹編號減一。
最後遞迴輸出。lrj
lrjlr
j老師真的tql
tqltq
l
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define for(i,a,b) for(int i=a;i<=b;i++)
using
namespace std;
#define ll long long
#define inf 0x3f3f3f3f3f3f3f3f
#define eps 1e-6
const
int maxn =
60000
;int t,kase,cnt;
char expr[maxn*5]
,*p;
//用於遍歷
int done[maxn]
;//結點是否已經輸出
struct node
}node[maxn]
;mapint>dict;
intparse()
if(*p==
'(')
//遞迴處理括號內容,注意左右括號和中間的逗號要跳過
if(dict.
count
(u)!=0)
return dict[u]
= id;
//未重複。
}void
print
(int v)
else}}
intmain()
return0;
}
簡析正規表示式
前段時間我利用業餘時間開發了一套基於標籤的cms系統,在其中為了處理基於標籤的資料提取與資料填充大量的使用了正規表示式,在這裡將我將正規表示式的語法和用法進行簡單的描述,然後下篇中將介紹在c 中利用正規表示式的方法與 例項。什麼是正規表示式 基本說來,正規表示式是一種用來描述一定數量文字的模式。re...
逆波蘭表示式的簡析
逆波蘭表示式又叫做字尾表示式。在通常的表示式中,二元運算子總是置於與之相關的兩個運算物件之間,這種表示法也稱為中綴表示。波蘭邏輯學家j.lukasiewicz於1929年提出了另一種表示表示式的方法,按此方法,每一運算子都置於其運算物件之後,故稱為字尾表示。字尾表示式求值 從左至右掃瞄表示式,遇到數...
簡析CSS表示式attr 的運用
css表示式 attr 用來獲取選擇到的元素的某一html屬性值,並用於其樣式。它也可以用於偽元素程式設計客棧,屬性值採用偽元素所依附的元素。attr 表示式可以用於任何css屬性。語法 css code複製內容到剪貼簿 ttr 功能早在css 2.1標準中就已經出現,但現在才開始普遍流行。它提供了...