C 表示式求值(利用二叉樹和棧分別描述)

2021-08-21 21:59:37 字數 2136 閱讀 8019

求例如「(123-5)*6+(9-8)*(5-6)-(10-2*(3-9))」這樣的表示式的值。

此類問題有兩種方法可以解答,第一種是利用二叉樹的性質,構建表達樹棧。第二種方法是利用兩個棧,乙個放運算子,乙個放資料,通過優先順序順序進行運算操作。

1)利用二叉樹描述

首先建立表示式樹棧,把整個表示式按照優先順序分解成各個子表示式,把子表示式分配給二叉樹的節點構成表達樹棧。表達樹棧建好之後就可以從根節點開始遞迴計算表示式的值。表達樹棧的建立過程如下:

struct expression

expression(double thevalue) :value(thevalue), op('#')

};class exptree

~exptree() //析構樹

void postordererase(expression* &exp) }

double calculate()

double mycal(expression* &exp)

double x = mycal(exp->left);

double y = mycal(exp->right);

switch (exp->op)

}}private:

expression* root;

void genexptree(const string& str, int b, int e, expression* & exp)

int brackets = 0;

int lastps = -1, las*** = -1;

bool findchar=false;

for (int i = b; i <=e; i++)

}} if (!findchar)

if (lastps == -1)

exp = new expression(str[lastps]);

genexptree(str, b, lastps - 1, exp->left);

genexptree(str, lastps+1,e, exp->right);

}};void testexpression()

2)利用兩個棧來描述

乙個棧用來放運算子,另乙個棧用來放資料。基本的思想是,如果運算子棧為空,則直接把運算子新增到運算子棧,否則,要比較棧外和棧內的運算子優先順序,如果棧內的運算子優先順序高(包括棧內的運算子和棧外的運算子處於乙個優先順序,也認為是棧內的優先順序高)則把棧內運算子彈出,再把彈出兩個資料符進行運算,把結果再次壓入資料符棧,當然新來的運算子也要入運算子棧。如果棧外的運算子高,則直接把運算子壓入運算子棧。如果遇見了『)』,則說明有一對括號了,此時要把括號裡的值計算好,把結果壓入資料棧,當然『)』不入棧,而且要把之前的『(』刪除。最後如果遍歷過程中遇見的是資料符,則直接查詢長度,把持續的資料先進行資料轉換stod,再把結果壓入資料棧。遍歷完成後,也許因為優先順序的關係,有些資料還沒計算,此時的運算優先順序是完全按照棧的出棧順序來的,因此直接出棧計算,直到運算子棧為空,此時的資料棧也只剩乙個元素就是最後的計算結果,返回此唯一的棧頂元素。

int priority(char a, char b)

else if (a == '(')

} else if (b == '*' || b == '/')

else if (a == '+' || a == '-' || a == '(')

} else if (b == '(')

return 0;

}double calculate(double x, char op, double y)

}double expstack(const string& str)

else if (priority(opor.top(),str[i]) > 0)

else if (str[i] == ')')

opor.pop();

}++i;

} else

opnd.push(stod(str.substr(k, i - k)));

} }//計算剩餘的數

while (!opor.empty())

return opnd.top();

}void testexpression()

棧 二叉樹 表示式 表示式樹 表示式求值

總時間限制 1000ms 記憶體限制 65535kb 描述 眾所周知,任何乙個表示式,都可以用一棵表示式樹來表示。例如,表示式a b c,可以表示為如下的表示式樹 a b c 現在,給你乙個中綴表示式,這個中綴表示式用變數來表示 不含數字 請你將這個中綴表示式用表示式二叉樹的形式輸出出來。輸入 輸入...

表示式求值 表示式轉二叉樹

1 後序表示式求值 後續表示式 逆波蘭式 的特點 沒有括號。求值方法 從前向後掃,遇到運算元壓棧 遇到操作符,從棧中取出2個運算元運算,結果壓棧。最終棧中所剩的數為結果。2 中序表示式求值 我們先來定義運算子的優先順序 從上到下依次公升高 準備2個棧,乙個專門存放運算子,另乙個專門存放運算元。1.遇...

C 二叉樹表示式計算

很早以前就寫過雙棧的表示式計算.這次因為想深入學一下二叉樹,網上都是些老掉牙的關於二叉樹的基本操作.感覺如果就學那些概念,沒意思也不好記憶.於是動手寫了乙個表示式計算的應用例子.這樣學習印象才深嘛.我喜歡逆過來貼 這是執行結果 cal 是節點類裡的計算方法,從根節點呼叫,遞迴所有子節點進行計算.le...