功能實現
四則運算中包含:括號、加減、乘除、小數點
樣例輸入:12.5-(8-3/2)*3+5
樣例輸出:-2
邏輯整理
建立兩個棧,分別用來儲存數字型別和操作符型別。
依次讀入每個字元,直至所有字元均遍歷完畢
判斷當前字元s是數字還是操作符
數字:由於數字的位數以及小數點情況均不確定,因此需要從當前字元的位置迴圈,直至下乙個是操作符的字元停止執行,將整個連續的數字字元拼接成乙個數字型別變數sum,這裡使用float,然後將該變數sum入數字棧。
字元:判斷字元棧是否為空
空棧:直接入字元棧
非空棧:取棧頂操作符,記為no。
判斷當前操作符s與棧頂操作符no的優先順序順序。具體優先順序從高到低依次如下所列:() -> */ -> +-。
若s優先順序高於no,那麼有兩種情況:
1.s為右括號')'。
(1)操作符棧頂操作符出棧->數字棧出棧兩次分別記為n1,n2->根據no對n1和n2進行計算->將計算結果入數字棧->讀取當前操作符棧頂操作符並賦值給no
(2)迴圈第(1)步操作直至no=='('
(3)操作符棧再出棧一次,目的是為了將'('給彈出
2.s不是')',那麼肯定有s為"*/"且no為"+-"
直接將s入操作符棧即可
若s優先順序等於no,只有可能為加對減或乘對除,根據運算子結合順序應該先計算先遇到的運算子,即先計算棧中的運算子,這裡不可能為括號因為若no為括號則必定包含有其他運算,如(3+4),這裡不符合要求。
出棧棧頂運算子並賦值給no->數字棧出棧兩次分別記為n1,n2->根據no對n1和n2進行計算->將計算結果入數字棧
若s優先順序低於no
若no是'('
直接將s入操作符棧
否則當操作符棧非空且s的優先順序不大於no的優先順序時,迴圈執行下列操作
1.操作符棧出棧並賦值給no
2.判斷no是否為'('
是->將no重新壓入操作符棧,跳出迴圈
3.數字棧出棧兩次分別記為n1,n2
4.根據no對n1和n2進行計算
5.將4中的計算結果入數字棧
6.讀取操作棧頂元素並賦值給no
將s壓入操作符棧
當操作符棧非空時,迴圈執行下列操作
1.出棧操作符棧並賦值給no
2.數字棧出棧兩次分別記為n1,n2
3.根據no對n1和n2進行計算
4.將3中的計算結果入數字棧
數字棧頂元素即為最終結果
**:
#include #include #include #include using namespace std;
int numi = 0;//數字棧頂指標
int opi = 0; //操作符棧頂指標
bool empnum();//判斷是否數字棧為空 空true
float popnum(float num);//數字棧出棧
void pushnum(float num, float n);//數字棧入棧
bool empop();//判斷是否操作符棧為空 空true
char popop(char op);//字元棧出棧
void pushop(char op, char o);//字元棧入棧
char getop(char op);//取字元棧棧頂元素
bool isnum(char s);//判斷s是否為數字型別,小數點也算
bool isop(char s);//判斷s是否為操作符型別
int checkpre(char s1, char s2);//判斷優s1和s2的優先順序;>返回1;《返回-1;==返回0
float cal(char s, float n1, float n2);//計算n1和n2對應s操作的結果
void clearc(char str, int n);//陣列初始化
bool empnum()
else
} float popnum(float num)
else
} void pushnum(float num, float n)
bool empop()
else
}char getop(char op)
else
} char popop(char op)
else
} void pushop(char op, char o)
bool isnum(char s)
else
}bool isop(char s)
else
}int checkpre(char s1, char s2)
else
}else if(s1 == '*' || s1 == '/')else if(s2 == '*' || s2 == '/')else
}else
}float cal(char s, float n1, float n2)
case '-':
case '*':
case '/':
} return n2;
}void clearc(char str, int n)
} int main()
sum = atof(stemp);
pushnum(num, sum);//入棧
i = j-1;
continue;
}else if(isop(s))else
popop(op);
}else
}else if(checkpre(s, no) == 0)elseelse
float n1 = popnum(num);
float n2 = popnum(num);
n2 = cal(no,n1,n2);
pushnum(num,n2);
no = getop(op);
}pushop(op,s);
} }
}} }
while(!empop())
cout
}
中綴 字尾表示式 四則運算
中綴表示式轉化為字尾表示式,並通過字尾表示式計算值 轉化規則 出棧 出棧後元素新增到字尾表示式的末尾 中綴表示式掃瞄完畢後,若棧內元素不為空,依次出棧直到棧為空,出棧元素新增到字尾表示式後 舉例 3 2 5 4 2 過程如下 建立操作符棧,以及儲存字尾表示式的佇列 從頭到尾掃瞄中綴表示式,首先掃瞄到...
四則運算的中綴表示式和字尾表示式
中綴表示式 就是運算符號在數字中間的表達方式。字尾表示式 運算符號在數字的後面出現。1 中綴表示式向字尾表示式的轉換方法 規則 從左到右遍歷中綴表示式的每個數字和符號,若是數字就輸出,即成為字尾表示式的一部分 若是符號,就判斷當前符號與棧頂符號的優先順序,如果是右括號或者是優先順序低於棧頂符號 乘除...
求解簡單的四則運算表示式
輸入乙個四則運算表示式,輸出運算結果,要求對除數為0的情況作特別處理。題目保證輸入與輸出均在雙精度範圍內。輸入格式 輸入在一行中依次輸入運算元1 運算子 運算元2,其間沒有空格,運算元的資料型別為實型。輸出格式 在一行中輸出表示式的運算結果,保留兩位小數。如果除法分母為0,則輸出錯誤資訊 divis...