表示式樹的建立

2021-06-16 10:33:31 字數 2052 閱讀 4293

(a+b)*(c*(d+e);

對該樹進行後序遍歷得到字尾表示式

ab+cde+**;

這裡實現的是如何根據乙個字尾表示式,構造出其相應的表示式樹。

演算法思想:其實很簡單,主要就是棧的使用。演算法時間複雜度是o(n),n是字尾表示式長度。

從前向後依次掃瞄字尾表示式,如果是運算元就建立乙個單節點樹,並把其指標壓入棧。如果是操作符,則

建立乙個以該操作符為根的樹,然後從棧中依次彈出兩個指標(這2個指標分別指向2個樹),作為該樹的

左右子樹。然後把指向這棵樹的指標壓入棧。直到掃瞄完字尾表示式。

最後棧中就會只有乙個指標。這個指標指向構造的表示式樹的根節點。

#include

#include

using namespace std;

struct node

};node *create_et(char *src)

else

s++;

}return st.top();

}void postorder(node *root)//這是後序遍歷

}int main()

如果輸入的是中綴表示式,可以把中綴表示式轉換為字尾表示式,可以參考:

中綴表示式如1*2+(2-1), 其運算子一般出現在運算元之間, 因此稱為中綴表示式,也就是大家程式設計中寫的表達

式。編譯系統不考慮表示式的優先級別, 只是對表示式從左到右進行掃瞄, 當遇到運算子時, 就把其前面的兩

個運算元取出, 進行操作。為達到上述目的, 就要將中綴表示式進行改寫,變為字尾表示式 如上面的表示式

1*2+(2-1), 就變為12*21-+;

字尾表示式中不含有括號, 且字尾表示式的運算元和中綴表示式的運算元排列次序完全相同, 只是運算子的

次序發生了改變。我們實現的時候,只需要用乙個特定工作方式的資料結構(棧),就可以實現。

其中stack op;用來存放運算子棧。陣列ans用來存放字尾表示式。

演算法思想:

從左到右掃瞄中綴表示式,是運算元就放進陣列ans的末尾。

如果是運算子的話,分為下面3種情況:

1)如果是『(』直接壓入op棧。

2)如果是『)』,依次從op棧彈出運算子加到陣列ans的末尾,知道遇到'(';

3) 如果是非括號,比較掃瞄到的運算子,和op棧頂的運算子。如果掃瞄到的運算子優先順序高於棧頂運算子

則,把運算子壓入棧。否則的話,就依次把棧中運算子彈出加到陣列ans的末尾,直到遇到優先順序低於掃瞄

到的運算子或棧空,並且把掃瞄到的運算子壓入棧中。

就這樣依次掃瞄,知道結束為止。

如果掃瞄結束,棧中還有元素,則依次彈出加到陣列ans的末尾,就得到了字尾表示式。

下面是程式**和問題描述:

問題描述:

請編寫程式將乙個中綴表示式轉換為字尾表示式。

輸入僅一行,是乙個中綴表示式。輸入的符號中只有這些基本符號「0123456789+-*/()」,並且不會出現形如2*-3的格式,所有數字都是個位數,「/」表示整除運算。

輸出僅一行,是轉換後的字尾表示式。數字之間、運算子之間、數字和運算子之間都用乙個空格隔開(參見樣例)。

樣例.in

8-(3+2*6)/5+4

.out

8 3 2 6 * + 5 / - 4 +

c++實現**:

#include #include #include using namespace std;

int prior(char op)

string middletolast(string middle)

else

op.pop();

}else

else

op.push(c);}}

}}

}}while(!op.empty())

return ans;

}int main()

{string mdata,res;

cin>>mdata;

res=middletolast(mdata);

for(int i=0;i

從字尾表示式建立表示式樹

在乙個公司呆久了,不出去看看,你永遠不知道你的水平如何,你值多少錢。也就是說,作為乙個技術人員,應該每隔4 5個月,出去參加幾次面試,看看自己的技術水平有沒有和it圈脫節。但更多的是在尋找更好的機會,找乙份更適合自己,待遇更高的工作。好了,從今天起,每天都總結乙個小的資料結構與演算法知識,一來擴充自...

表示式 使用API建立表示式樹(5)

一 conditionalexpression 表示式 生成如 iif a b a和b相等 a與b不相等 式子。使用 parameterexpression aip1 expression.parameter typeof int a 1 parameterexpression aip2 expre...

表示式 使用API建立表示式樹(3)

一 debuginfoexpression 發出或清除除錯資訊的序列點。這允許偵錯程式在除錯時突出顯示正確的源 static void main string args 執行了下 未經處理的異常 system.reflection.targetinvocationexception 呼叫的目標發生了...