求例如「(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...