以字串的形式輸入乙個算術表示式,如何對其進行識別並計算出結果呢?
如果按照普通的算術表示式計算,由於需要考慮到操作符和括號的優先順序,實現起來十分麻煩。但是基於逆波蘭表示式(也稱字尾表示式)來計算的話,可以忽略其優先順序順序進行計算,十分簡便。
逆波蘭表示式的定義及演算法可以很方便的查詢到,這裡不再贅述。
程式的說明如下:
輸入乙個算術表示式,將其轉換成為字尾表示式並輸出計算結果。算術表示式中只能識別「+」、「-」、「*」、「/」四種運算子,負數需要用括號表示:如「(-1)」。對於除了運算元和運算子之外的字元自動忽略。
首先是棧的定義以及字串轉換為長整形long的函式:
templateclass stack
const t& top()
void push(const t& item)
bool empty()
private:
std::vectordata;
int topstack = -1;
};long str_to_num(const std::string& s)
程式實現的思路及**如下:
1.讀取表示式,構造vector儲存成為普通的中綴表示式。忽略無意義字元,對於負數,去除括號儲存。
void expression(std::vector&vec ,const std::string& s)
else if (*iter == '+' || *iter == '-' || *iter == '*' || *iter == '/')
else if (*iter == '(')
if (*(++iter) == '-')
else
vec.push_back("(");
} else if (*iter == ')')
} else ++iter;
} if (num.size() != 0)
vec.push_back(num);
}
2.歷遍中綴vector,利用棧構造字尾vector:
(1)對於運算元和左括號「(」,直接放入棧中。
(2)對於操作符「+」、「-」,彈出棧內元素直至棧為空或者遇到「(」,將操作符放入棧中。
(3)對於操作符「*」、「/」,彈出棧內元素直至棧為空或者遇到「+」、「-」、「(」,將操作符放入棧中。
(4)對於右括號「)」,彈出棧內元素直至遇到左括號「(」。
(5)歷遍結束後,彈出棧內所有元素。
void postfix_exp(std::vector&p_vec, std::vector&vec)
sta.push(oper);
} else if (oper == "*" || oper == "/")
sta.push(oper);
} else if (oper == ")")
p_vec.push_back(sta.top());
sta.pop();
}} else sta.push(oper);
} while (!sta.empty())
std::cout << "the postfix-expression is : ";
for (auto &row : p_vec)
std::cout << row<
std::cout << std::endl;
}
3.歷遍字尾vector。對於運算元轉換成為長整形long放入棧中;對於運算子則彈出兩個運算元進行計算,然後將結果放入棧中。棧中剩餘的最後一項便是計算的最終結果。
const long count(std::vector&vec)
else if (oper == "-")
else if (oper == "*")
else if (oper == "/")
else
sta.push(str_to_num(oper));
} if (!sta.empty())
return sta.top();
else
return 0;
}
最後則是main()函式的**:
int main() {
while (true) {
std::string str;
std::cout << "enter the expression,or q for quit : ";
std::cin >> str;
if (str == "q")
break;
std::vectorexp;
std::vectorp_exp;
expression(exp, str);
postfix_exp(p_exp, exp);
std::cout << "the result is : " << count(p_exp) <
新手一枚,歡迎大大們的建議和指導! 逆波蘭算術表示式
傳統的算術表示式是由運算元 又叫運算物件或運算量 和運算子以及改變運算次序的圓括號連線而成的式子。其運算規則如下 1 先計算括號內,後計算括號外 2 在無括號或同層括號內,先進行乘除運算,後進行加減運算,即乘除運算的優先順序高於加減運算的優先順序 3 同一優先順序運算,從左向右依次進行。在這種表示式...
算術表示式求解背景 逆波蘭表示式
逆波蘭表示式是一種把運算子前置的算術表示式,例如普通的表示式2 3的逆波蘭表示法為 2 3。逆波蘭表示式的優點是運算子之間不必有優先順序關係,也不必用括號改變運算次序,例如 2 3 4的逆波蘭表示法為 2 3 4。本題求解逆波蘭表示式的值,其中運算子包括 四個。輸入 輸入為一行,其中運算子和運算數之...
波蘭表示式 逆波蘭表示式
中綴表示式是最常見的運算表示式,如 3 5 2 6 1 波蘭表示式又稱為字首表示式,它是由中綴表示式經過一定的方式轉換來的 比如中綴表示式為 3 5x 2 6 1 對應的字首表示式為 3 x 5 2 6 1 對於中綴表示式從右向左遍歷轉換為字首表示式,中途要是用棧進行儲存 轉換規則如下 波蘭表示式 ...