算術表示式的計算(基於逆波蘭表示式)的c 實現

2021-07-05 11:02:11 字數 2643 閱讀 5233

以字串的形式輸入乙個算術表示式,如何對其進行識別並計算出結果呢?

如果按照普通的算術表示式計算,由於需要考慮到操作符和括號的優先順序,實現起來十分麻煩。但是基於逆波蘭表示式(也稱字尾表示式)來計算的話,可以忽略其優先順序順序進行計算,十分簡便。

逆波蘭表示式的定義及演算法可以很方便的查詢到,這裡不再贅述。

程式的說明如下:

輸入乙個算術表示式,將其轉換成為字尾表示式並輸出計算結果。算術表示式中只能識別「+」、「-」、「*」、「/」四種運算子,負數需要用括號表示:如「(-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 對於中綴表示式從右向左遍歷轉換為字首表示式,中途要是用棧進行儲存 轉換規則如下 波蘭表示式 ...