中綴表示式轉化為字尾表示式並求值
程式碼功能:將輸入的中綴表示式轉化為字尾表示式並進行一個值的求,支援括號。
思路:見程式碼。
#include <iostream>
#include <stack>
#include <string>
#include <vector>
using namespace std;
void showAndPush(vector<string> &expr, const string &s, char t = ' ') {
expr.push_back(s);
cout << s << t;
}
bool isOper(const string &s) {
return s.length() > 0 && (s[0] == '+' || s[0] == '-' || s[0] == '*' || s[0] == '/');
}
int cal(int num, int num1, char oper) {
switch (oper) {
case '+': return num + num1;
case '-': return num - num1;
case '*': return num * num1;
case '/': return num / num1;
}
}
void infixToSuffix(int &p, const string &text, vector<string> &expr) {
stack<char> stk;
int len = text.length();
for (; p < len; ++p) {
switch (text[p]) {
case '+':
case '-':
while (!stk.empty() && (stk.top() == '*' || stk.top() == '/')) {
cout << stk.top(); stk.pop();
}
stk.push(text[p]);
break;
case '*':
case '/':
stk.push(text[p]);
break;
case '(':
infixToSuffix(++p, text, expr);
break;
case ')':
while (!stk.empty()) {
showAndPush(expr, string(1, stk.top()));
stk.pop();
}
return;
default:
string num;
while (isdigit(text[p])) {
num.push_back(text[p]);
++p;
}
--p;
showAndPush(expr, num);
}
}
while (!stk.empty()) {
showAndPush(expr, string(1, stk.top()));
stk.pop();
}
}
int calculate(const vector<string> &expr) {
stack<int> num;
for (auto &iter : expr) {
if (isOper(iter)) {
int t = num.top(); num.pop();
int t1 = num.top(); num.pop();
num.push(cal(t,t1,iter[0]));
} else {
num.push(stoi(iter));
}
}
return num.top();
}
void sln() {
string text;
cin >> text;
vector<string> expr;
int p = 0;
infixToSuffix(p, text, expr);
cout << endl;
cout << calculate(expr) << endl;
}
int main() {
sln();
return 0;
}
執行截圖:
未處理除零、括號不匹配以及出現非法字元等錯誤。
相關文章
- 中綴表示式轉字尾表示式
- 逆波蘭演算法、中綴表示式轉字尾表示式演算法
- 教你如何在C++中實現中綴表示式轉字尾表示式C++
- 【資料結構與演算法】中綴表示式轉字尾表示式以及字尾表示式的計算資料結構演算法
- 字首中綴字尾表示式規則
- 中綴表示式轉為逆波蘭表示式
- 資料結構與演算法——棧(五)中綴表示式轉字尾表示式資料結構演算法
- 中綴轉字尾表示式思路分析和程式碼實現
- 中綴表示式
- js實現四則計算(中綴,字尾表示式)JS
- 資料結構 中綴表示式轉化資料結構
- 前中字尾表示式
- 將算數表示式轉換成字尾表示式並計算結果
- 關於利用STL棧求解四則中綴表示式以及中綴表示式轉逆波蘭表示式和逆波蘭表示式的求解
- Task A1 中綴表示式轉換為逆波蘭式
- 何謂中綴表示式
- 計算中綴表示式
- 3.2.5 表示式求值
- C語言- 基礎資料結構和演算法 - 09 棧的應用_中綴表示式轉字尾表示式20220611C語言資料結構演算法
- Java表示式求值引擎 - AviatorJava
- 棧的應用---字尾表示式
- 使用棧結構計算中綴表示式
- 中綴轉字尾和字首
- 資訊學奧賽複賽複習09-CSP-J2020-03表示式求值前置知識點-中綴表示式求值、摸運算、模運算性質、棧
- 【棧】【字串語法】牛牛與字尾表示式字串
- [藍橋杯 2019 省 B] 字尾表示式
- 利用 Lambda 表示式實現 Java 中的惰性求值Java
- 利用Lambda表示式進行Java中的惰性求值Java
- 正規表示式中 “$” 並不是表示 “字串結束字串
- C#字尾表示式解析計算字串公式C#字串公式
- 藍橋杯2019年真題:字尾表示式
- Leetcode——150. 逆波蘭表示式求值LeetCode
- LeetCode-150- 逆波蘭表示式求值LeetCode
- 逆波蘭表示式求值 golang VS pythonGolangPython
- 逆波蘭表示式求值——棧與佇列佇列
- 力扣-150. 逆波蘭表示式求值力扣
- 一種簡易的表示式求值演算法演算法
- 【正規表示式】常用的正規表示式(數字,漢字,字串,金額等的正規表示式)字串