概念:
字尾表示式是相較於中綴表示式而言的,像我們平時寫的2+3*(4-(5+6))/7就是乙個中綴表示式,那麼如何將之變為字尾表示式呢?字尾表示式如何用來求解呢?
先來第乙個問題(中綴->字尾):
變為字尾表示式方法(規則
):1.遇到運算元:直接新增到字尾表示式中
2.棧為空時,遇到運算子,直接入棧
3.遇到左括號:將其入棧
4.遇到右括號:執行出棧操作,並將出棧的元素輸出,直到彈出棧的是左括號,左括號不輸出。
5.遇到其他運算子:加減乘除:彈出所有優先順序大於或者等於該運算子的棧頂元素,然後將該運算子入棧。
6.最終將棧中的元素依次出棧,輸出。
用乙個例項來分析:
x = 2+3*(4-(5+6))/7
1、遇到運算元
2,新增到字尾表示式中
2 (此時的字尾表示式,下同)
2、棧為空,遇到加號『
+』,將『
+』入棧23
、遇到運算元
3,新增到字尾表示式中234
、遇到操作符
『*』,棧頂為
『+』,
『*』優先順序大於
『-』,不出棧,
『*』入棧235
、遇到左括號『(
』,直接入棧。236
、遇到運算元
4,新增到字尾表示式中
2347
、遇到減號
『-』,棧頂為『(
』,『-』入棧
2348
、遇到左括號『(
』,直接入棧。
2349
、遇到運算元
5,新增到字尾表示式中
2345
10、遇到加號『
+』,棧頂為『(』,
『+』入棧
2345
11、遇到運算元
6,新增到字尾表示式中
23456
12、遇到右括號『)
』(不入棧
),出棧
『+』,出棧『(
』(不新增到字尾表示式中)
23456+
13、遇到右括號『)
』(不入棧
),出棧
『-』,出棧『(
』(不新增到字尾表示式中)
23456+-
14、遇到
『/』,棧頂為
『*』,
『/』優先順序大於
『*』,將
『*』出棧
23456+-*
15、遇到操作時
7,新增到字尾表示式中
23456+-*7
16、把棧中剩下的符號都出棧
**實現:
char* postfix_expression(string str)第二個問題,如何使用字尾表示式來解表示式字尾表示式已經將計算的優先順序排好,只需要將字尾表示式的數字逐個入棧,直到遇到符號,將前棧頂兩個元素運算放回棧頂即可。s_c.pop();
}//如果符號是*或/高優先順序,彈出所有*和/
else if(str[i]=='*'||str[i]=='/')
s_c.push(str[i]);
}//如果符號是+或-低優先順序,彈出所有*/+-
else if(str[i]=='+'||str[i]=='-')
s_c.push(str[i]);
}else
s_c.push(str[i]);
} }while(!s_c.empty())
return temp;
}
以上面的字尾表示式為例:
上**~
#include #include #include #include using namespace std;stacks_n;
stacks_c;
//上面的字尾表示式轉換函式
char* postfix_expression(string str);
int main()
else if(pe[i]=='*')
else if(pe[i]=='/')
else if(pe[i]=='+')
else if(pe[i]=='-')
}cout執行結果:
計算器 字尾表示式
不過目前這個功能太少,而且能算的十分有限,測試輸入為 4 4 5 3 測試輸出為 4 4 5 3 27 主要就是了解一下怎麼把中綴表示式轉化成字尾表示式,然後再利用字尾表示式求值,我後續會完善這個程式,做個真正意義上的計算器。o o 轉化步驟我搜尋了一下,大致如下 將中綴表示式轉換為等價的字尾表示式...
計算器(表示式計算 字尾表示式實現)逆波蘭表示式
問題描述 從標準輸入中讀入乙個整數算術運算表示式,如24 1 2 36 6 2 2 12 2 2 計算表示式結果,並輸出。要求 1 表示式運算子只有 表示式末尾的 字元表示表示式輸入結束,表示式中可能會出現空格 2 表示式中會出現圓括號,括號可能巢狀,不會出現錯誤的表示式 3 出現除號 時,以整數相...
表示式計算器
早在上大學的時候,就想編寫乙個可以計算數學表示式的計算器,因為windowsxp自帶的計算器不支援表示式輸入,當要計算乙個算式時,不太方便。表示式計算器看似簡單,但要想把它做完善,不太容易,經過幾次改進之後,於一年前完成了這個小程式,雖然可能會有一些不足,不過也不打算再投入時間了,價值不大,只是拿來...