#33104: 有高手能幫忙解答嗎?


zhaojiayang0123456789@gmail.co ... (三酸二鹼實驗室)

學校 : 不指定學校
編號 : 160552
來源 : [111.242.16.40]
最後登入時間 :
2023-10-21 19:27:25
a017. 五則運算 | From: [114.39.231.182] | 發表日期 : 2022-11-30 23:08

為什麼我用以下的程式碼過了四則運算,卻過不了五則運算?一直卡在 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;
}

 
#33133: Re: 有高手能幫忙解答嗎?


cges30901 (cges30901)

學校 : 不指定學校
編號 : 30877
來源 : [101.136.203.77]
最後登入時間 :
2024-04-07 15:34:14
a017. 五則運算 | From: [39.10.41.131] | 發表日期 : 2022-12-04 08:33

為什麼我用以下的程式碼過了四則運算,卻過不了五則運算?一直卡在 WA(line:3)?


給你一個測資你自己想想看

3 - 2 * 3 + 4

 
ZeroJudge Forum