(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 呼叫的目標發生了...