為什麼我用以下的程式碼過了四則運算,卻過不了五則運算?一直卡在 WA(line:3)?
#include <iostream>
#include <stack>
#include <sstream>
#include <string>
using namespace std;
stringstream ss;
int precedence_comparison(char& c) {//比較二元運算子優先級
if (c == '(') {
return 0;
}
else if (c == '+' || c == '-') {
return 1;
}
else if (c == '*' || c == '/' || c == '%') {
return 2;
}
else {//非預期的運算子
return -1;
}
}
bool shunting_yard_algorithm(string& input, string& output) {
stack<char> S;//儲存運算子的棧,目前只能儲存單符號運算子
int n = 0;
for (char& c : input) {//讀取運算式
if ('0' <= c && c <= '9') {//如果讀取到數字
ss << c;
}
else if (c == ' ') {//如果讀取到空格
if (ss.str().size() != 0 && ss.str().at(ss.str().size() - 1) != ' ') {//且運算式並無空格分隔
ss << " ";//輸入空格至陣列
}
}
else if (c != ' '){//如果讀取到運算子或函數
if (ss.str().size() != 0 && ss.str().at(ss.str().size() - 1) != ' ') {//且運算式並無空格分隔
ss << " ";//輸入空格至陣列
}
if ('A' <= c && c <= 'z') {//函數,目前沒寫好
}
/*
* else if (i == ',') {
* ignore;
* }
*/
else {//運算子,目前只能處理單符號且左結合性的運算子
if (S.empty()) {//若棧為空
S.push(c);//輸入棧
}
else if (c == '(') {//若當前運算子為 (
S.push(c);//輸入棧
}
else if (c == ')') {//若當前運算子為 )
while (S.top() != '(' && !S.empty()) {
ss << S.top() << " ";//將棧運算子彈出至陣列直至遇見左括號
S.pop();
}
if (!S.empty()) {
S.pop();//刪除左括號
}
}
else {
if (precedence_comparison(c) <= precedence_comparison(S.top())) {//若當前運算子的優先級 <= 棧頂運算子之優先級
ss << S.top() << " ";//將棧頂運算子彈出至陣列後,
S.pop();
S.push(c);//再輸入棧
}
else {//否則
S.push(c);//直接輸入棧
}
}
}
}
n++;
}
ss << " ";
while (!S.empty()) {
ss << S.top() << " ";
S.pop();
}
getline(ss, output);
ss.str("");
ss.clear();
n = 0;
return true;
}
int solution(string& output) {
stack<int> S;
int e = 0;
for (char& c : output) {
if ('0' <= c && c <= '9') {
ss << c;
}
else if (c == ' ' && !ss.str().empty()) {
ss >> e;
S.push(e);
ss.str("");
ss.clear();
}
else if (c != ' ') {//運算子,目前只能處理單符號且左結合性的運算子
e = S.top();
S.pop();
switch (c) {
case '+':
S.top() =S.top() + e;
break;
case '-':
S.top() =S.top() - e;
break;
case '*':
S.top() =S.top() * e;
break;
case '/':
S.top() =S.top() / e;
break;
case '%':
S.top() =S.top() % e;
break;
default:
break;
}
}
}
return S.top();
}
int main() {
string input = "";
string output = "";
while (getline(cin, input)) {
shunting_yard_algorithm(input, output);
cout << solution(output) << "\n";
}
return 0;
}