QA3

简介: 该程序使用双栈(数字栈和运算符栈)实现算术表达式求值,支持加减乘除、乘方及括号运算。通过优先级控制运算顺序,最终输出计算结果。
#include <stdio.h>
#include <stdbool.h>

#define MAX_SIZE 100

// 数字栈(操作数栈)
int num_stack[MAX_SIZE];
int num_top = -1;

// 运算符栈
char op_stack[MAX_SIZE];
int op_top = -1;

// 初始化栈
void initStacks() {
   
    num_top = -1;
    op_top = -1;
}

// 数字栈操作
bool pushNum(int n) {
   
    if (num_top >= MAX_SIZE - 1) return false;
    num_top++;
    num_stack[num_top] = n;
    return true;
}

int popNum() {
   
    if (num_top == -1) return 0;
    int val = num_stack[num_top];
    num_top--;
    return val;
}

bool isNumStackEmpty() {
   
    return num_top == -1;
}

// 运算符栈操作
bool pushOp(char op) {
   
    if (op_top >= MAX_SIZE - 1) return false;
    op_top++;
    op_stack[op_top] = op;
    return true;
}

char popOp() {
   
    if (op_top == -1) return '\0';
    char op = op_stack[op_top];
    op_top--;
    return op;
}

bool isOpStackEmpty() {
   
    return op_top == -1;
}

// 计算 a op b
int applyOp(int a, int b, char op) {
   
    switch (op) {
   
        case '+': return a + b;
        case '-': return a - b;
        case '*': return a * b;
        case '/': return a / b;      // 整数除法
        case '^': {
   
            int result = 1;
            for (int i = 0; i < b; i++) {
   
                result *= a;
            }
            return result;
        }
        default: return 0;
    }
}

// 获取运算符优先级(数字越大优先级越高)
int getPrecedence(char op) {
   
    if (op == '+' || op == '-') return 1;
    if (op == '*' || op == '/') return 2;
    if (op == '^') return 3;
    return 0; // 括号等
}

// 处理栈中运算符直到遇到 '(' 或栈空
void processOperators() {
   
    while (!isOpStackEmpty()) {
   
        char op = op_stack[op_top];
        if (op == '(') break;
        // 弹出两个操作数和一个运算符进行计算
        int b = popNum();
        int a = popNum();
        char op_char = popOp();
        int result = applyOp(a, b, op_char);
        pushNum(result);
    }
}

// 主函数
int main() {
   
    initStacks();
    char ch;
    printf("请输入算术表达式(以 # 结束,操作数为一位数字):\n");

    ch = getchar();
    while (ch != '#') {
   
        if (ch >= '0' && ch <= '9') {
   
            // 数字直接入数字栈
            pushNum(ch - '0');
        }
        else if (ch == '(') {
   
            // 左括号直接入运算符栈
            pushOp(ch);
        }
        else if (ch == ')') {
   
            // 遇到右括号,计算直到左括号
            while (!isOpStackEmpty() && op_stack[op_top] != '(') {
   
                int b = popNum();
                int a = popNum();
                char op = popOp();
                int res = applyOp(a, b, op);
                pushNum(res);
            }
            // 弹出左括号
            if (!isOpStackEmpty()) {
   
                popOp(); // 弹出 '('
            }
        }
        else if (ch == '+' || ch == '-' || ch == '*' || ch == '/' || ch == '^') {
   
            // 处理运算符优先级
            while (!isOpStackEmpty() && op_stack[op_top] != '(' &&
                   getPrecedence(op_stack[op_top]) >= getPrecedence(ch)) {
   
                int b = popNum();
                int a = popNum();
                char op = popOp();
                int res = applyOp(a, b, op);
                pushNum(res);
            }
            pushOp(ch);
        }
        // 忽略其他字符(本题无空格,可不处理)
        ch = getchar();
    }

    // 处理剩余运算符
    while (!isOpStackEmpty()) {
   
        int b = popNum();
        int a = popNum();
        char op = popOp();
        int res = applyOp(a, b, op);
        pushNum(res);
    }

    // 最终结果在数字栈顶
    int result = popNum();
    printf("表达式结果: %d\n", result);

    return 0;
}
相关文章
|
19天前
|
机器学习/深度学习 人工智能 监控
智能的三重境界:从感知、认知到决策的进化
智能的三重境界:从感知、认知到决策的进化
365 121
|
20天前
|
存储 SQL 消息中间件
从 ClickHouse 到 StarRocks 存算分离: 携程 UBT 架构升级实践
查询性能实现从秒级到毫秒级的跨越式提升
|
4天前
|
人工智能 供应链 算法
1688开店必看丨新手商家人手一份的运营指南!
在中国电商的宏大叙事中,当大众的目光多聚焦于淘宝、京东等直面消费者的零售巨头时,一条潜行于幕后的“超级供应链动脉”正以前所未有的力量重塑着中国商业的毛细血管。这便是阿里巴巴集团旗下的核心B2B平台——1688。
210 99
|
5天前
|
安全 IDE Java
告别模板代码:体验Java Record的高效与简洁
告别模板代码:体验Java Record的高效与简洁
161 115
|
12天前
|
设计模式 前端开发 测试技术
告别脆弱:构建稳定UI自动化测试的3个核心策略
告别脆弱:构建稳定UI自动化测试的3个核心策略
197 113
|
9天前
|
机器学习/深度学习 人工智能 算法
生成式人工智能算法备案的背景及发展趋势V3.0 20251029更新
本文记录作者两年来亲历算法备案政策 evolution,从2023年ChatGPT引发AIGC热潮,到2025年备案趋严、审核升级,展现我国AI监管由“增量”转向“提质”的全过程。揭示AI发展需合规护航,备案已成产品上线刚需,未来门槛将更高,草根入局愈发艰难。
生成式人工智能算法备案的背景及发展趋势V3.0 20251029更新
|
5天前
|
前端开发 开发者
不止于代码:如何写出吸引人的技术博客?
不止于代码:如何写出吸引人的技术博客?
142 115
|
10天前
|
机器学习/深度学习 人工智能 数据安全/隐私保护
突破“伪装”:检测AI生成内容的技术与挑战
突破“伪装”:检测AI生成内容的技术与挑战
189 121
|
11天前
|
监控 关系型数据库 MySQL
在CentOS系统中,如何统计哪个进程打开了文件描述符?
利用上述方法,你可以有效地监控和统计CentOS系统中的进程打开的文件描述符数量,以帮助排查错误或优化系统配置。通过组合使用各种工具和命令,可以获得对系统状态和行为的深入了解,进而做出相应的调整和优化。这些技术对于系统管理员以及希望更深入了解系统内部工作原理的技术人员来说,是极具价值的知识。
196 104
|
5天前
|
前端开发 JavaScript Cloud Native
技术栈全景:如何为你的项目选择正确的心脏与骨骼
技术栈全景:如何为你的项目选择正确的心脏与骨骼
209 113