HNU 数据结构与算法 实验一 线性结构编程题1. 表达式求值

#include <iostream>
#include <stack>
#include <cctype> //包含字符处理函数库,例如isdigit函数用于检查字符是否是数字。

using namespace std;

bool isOperator(char c) {
    return c == '+' || c == '-' || c == '*' || c == '/';
}                     //定义了一个函数,用于判断给定字符是否是算术操作符。

int precedence(char op) {
    if (op == '+' || op == '-')
        return 1;
    else if (op == '*' || op == '/')
        return 2;
    else
        return 0;
}                    // 定义了一个函数,用于获取算符的优先级。

void applyOperator(stack<char>& operators, stack<int>& values) {
    char op = operators.top();
    operators.pop();
    int right_operand = values.top();
    values.pop();
    int left_operand = values.top();
    values.pop();
    switch (op) {
        case '+':
            values.push(left_operand + right_operand);
            break;
        case '-':
            values.push(left_operand - right_operand);
            break;
        case '*':
            values.push(left_operand * right_operand);
            break;
        case '/':
            values.push(left_operand / right_operand);
            break;
    }
}                   //定义了一个函数,用于应用操作符到操作数上,执行相应的操作。

int evaluateExpression(const string& expression) {
    stack<char> operators;   // 创建一个操作符栈
    stack<int> values;       // 创建一个操作数栈
    for (int i = 0; i < expression.length(); ++i) { 
        if (isdigit(expression[i])) {
            int num = 0;
            while (i < expression.length() && isdigit(expression[i])) {  // 循环直到不是数字为止
                num = num * 10 + (expression[i] - '0');                  // 将连续的数字字符转换为数字
                ++i;
            }
            values.push(num);   // 将数字压入操作数栈
            --i;                // 退回到最后一个数字的位置
        } else if (isOperator(expression[i])) {   // 如果当前字符是操作符
            while (!operators.empty() && precedence(operators.top()) >= precedence(expression[i])) {
                applyOperator(operators, values);  // 应用操作符到操作数上
            }
            operators.push(expression[i]);     // 将操作符压入操作符栈
        } else if (expression[i] == '(') {
            operators.push(expression[i]);
        } else if (expression[i] == ')') {     // 如果当前字符是右括号
            while (operators.top() != '(') {   // 当栈顶不是左括号时
                applyOperator(operators, values);    // 应用操作符到操作数上
            }
            operators.pop(); // 弹出左括号
        } else if (expression[i] != '#') {  // 如果当前字符是非法字符
            return 0;   // 返回0,表示表达式包含非法字符
        }
    }
    while (!operators.empty()) {  // 当操作符栈非空时
        applyOperator(operators, values);    // 应用操作符到操作数上
    }
    return values.top();     // 返回操作数栈顶的值,即表达式的计算结果
}                    //定义了一个函数,用于评估给定的表达式,并返回计算结果。

int main() {
    string expr;
    getline(cin, expr);
    int result = evaluateExpression(expr);
    if (result == 0) {
        cout << "NO" << endl;
    } else {
        cout << result << endl;
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值