#include #include #include //#define fin cin
//#define fo
using namespace std;
bool isoperator(char x)
int getpriority(char x)
bool isbracket(char x)
int dooperate(int d1,int d2,char t)
if(isoperator(x))
s.pop();//彈出)
}else
s.push(x);}}
}if(!isoperator(x)&&i==str.size()-1)
q.push(stoi(temp));
}while(!s.empty())
cout《實現思想:一邊中綴轉字尾一邊計算,這樣只需要一次掃瞄就可以計算完畢,計算複雜度為o(n),計算步驟如下
處理某個x
判斷是運算元還是運算子
處理字元
如果運算子棧s為空,直接將x壓入s棧
如果運算子棧s不空,且x是'('或者x的優先順序大於棧頂元素優先順序,x壓棧
如果s不空,且x優先順序小於等於棧頂元素,彈棧處理至s為空或者x優先順序大於棧頂
如果x為')',處理至'('
當處理完所有字元之後,彈棧處理直到s為空,q的棧頂即為所求
彈棧處理:取q的兩個元素,目前棧頂為d2,將d2彈出之後的棧頂為d1,設操作符棧頂為t,則處理過程為計算 d1 t d2,然後後將d1 t d2壓棧,此過程中d1,d2, t都已經彈棧了
實現細節:
如何擷取運算元?兩個操作符(或者頭與操作符,操作符與尾)之間的為運算元
優先順序的判定?此處應該注意'(',因為與棧頂優先順序比較,如果不給'('設定乙個優先順序在判斷時會產生錯誤,可以將(優先順序設定為最低。
短路與和短路或?會不會產生因為壓入乙個'('就將之前的都計算的錯誤呢?因為上面的設定?不會的,因為在下面這句**裡,我們會首先判斷是不是括號,如果滿足條件,不會計算||之後的條件,因為a||b這樣的判斷,如果a為真,不管b是否為真該語句都是真,所以不會判斷b條件,從而不會產生錯誤
if(x=='('||
((!isbracket(x))&&
(getpriority(x)>getpriority(s.top()))))
s.push(x);
while(!s.empty()&&
((getpriority(s.top())>getpriority(x))||(getpriority(x)==getpriority(s.top()))))
實現簡易計算器
python 剛學python 老師帶著寫了乙個計算器。話不多說直接上 from tkinter import 匯入模組 top tk 設定視窗物件 top.title 計算器 設定視窗標題 v strin ar 接受使用者輸入的字元 v.set 0 設定字元預設值 isopera false 是否...
計算器簡易實現
testdlg.cpp 實現檔案 include stdafx.h include include test.h include testdlg.h include afxdialogex.h ifdef debug define new debug new endif define tag add...
計算器之C 簡易實現
利用棧完成算術表示式求值 從鍵盤或檔案中輸入算術表示式,計算其結果並顯示。1 轉換為字尾表示式並輸出 2 對字尾表示式求值並輸出。輸入的表示式中可以有整數 實數 括號,運算子包括 代表單目負 可以多次輸入不同的表示式進行計算,直到使用者選擇 退出 對於以上該計算器,我們可以先使用乙個棧暫時儲存操作符...