我能想到幾個簡單的方法。
最簡單的是按優先級排序的運算符列表。如果新操作員位於堆棧頂部的操作員之前,則新操作員具有更高的優先級。在這裏不會花太多時間,因爲它有致命的缺陷。這有問題,因爲許多運算符具有相同的優先級(例如+和 - ),並且必須按照它們的發現順序執行。
第二個是運算符和它的優先級之間的映射。例如:
struct Operator
{
std::string op;
int precedence;
}
在這種情況下,您會比較precedence
以查看哪個更大。
if (newoperator.precedence > stack.peek().precedence)
{
// do something
}
else if (newoperator.precedence < stack.peek().precedence)
{
// do something else
}
else
{
// do whatever you do when the operators have the same precedence
}
而且因爲這是C++,你可以
struct Operator
{
std::string op;
int precedence;
int prioritycompare(const Operator & other)
{
return precedence - other.precedence;
}
}
爲了讓生活更容易一點給你。
然後你可以走得更遠並建立一個類層次結構,儘管在編程生涯的這一點上你可能不想去這裏了。聽我說,寫起來容易多了。
struct Operator
{
std::string op;
int precedence;
~Operator()
{
\\does nothing
}
virtual int operate(int A, int B) = 0; // pure virtual function
int prioritycompare(const Operator & other)
{
return precedence - other.precedence;
}
}
struct plus: public Operator
{
int operate(int A, int B)
{
return A+B;
}
}
然後,如果你手上有任何操作,你可以測試優先級和執行操作
result = newoperator.operate(val1, val2);
,並不在乎它到底是什麼樣的操作,因爲多態性的魔力照顧爲你保存書籍。該程序將爲正確的類調用正確的函數。
請看這裏:http://en.cppreference.com/w/cpp/language/operator_precedence –
「似乎沒有工作」不是一個有效的問題。除了你知道什麼是「tkn」,或者你所發佈的微小代碼片段中引用的所有類和模板的定義之外,沒有人知道你的代碼的其餘部分。 –
我提過tkn是一個堆棧。整個代碼太大而無法投入。所有我需要知道的是,如果我不知道哪些運算符將被檢查,我將如何檢查哪個運算符比哪個運算符具有更高的優先級。 – Brightscales