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;
}
相关文章
|
30天前
|
机器学习/深度学习 人工智能 监控
智能的三重境界:从感知、认知到决策的进化
智能的三重境界:从感知、认知到决策的进化
477 121
|
1月前
|
存储 SQL 消息中间件
从 ClickHouse 到 StarRocks 存算分离: 携程 UBT 架构升级实践
查询性能实现从秒级到毫秒级的跨越式提升
|
9天前
|
弹性计算 缓存 网络协议
阿里云u2i实例——企业上云第一台云服务器,通用算力型ECS费用价格整理
阿里云ECS通用算力型u2i实例,企业入门首选,搭载Intel Xeon Platinum处理器,2核4G仅640元/年,4核8G仅1170元/年,低至2.5折,开发测试成本直降75%,助力中小企业高效上云。
232 90
|
10天前
|
API PHP 数据库
解锁PHP数组的强大威力:超越基础遍历
解锁PHP数组的强大威力:超越基础遍历
|
19天前
|
运维 算法 数据可视化
基于MATLAB的自然图像梯度分布重尾特性验证方案
基于MATLAB的自然图像梯度分布重尾特性验证方案
|
1月前
|
Java API 开发者
告别 NullPointerException:拥抱 Java Optional
告别 NullPointerException:拥抱 Java Optional
205 117
|
20天前
|
机器学习/深度学习 人工智能 算法
生成式人工智能算法备案的背景及发展趋势V3.0 20251029更新
本文记录作者两年来亲历算法备案政策 evolution,从2023年ChatGPT引发AIGC热潮,到2025年备案趋严、审核升级,展现我国AI监管由“增量”转向“提质”的全过程。揭示AI发展需合规护航,备案已成产品上线刚需,未来门槛将更高,草根入局愈发艰难。
生成式人工智能算法备案的背景及发展趋势V3.0 20251029更新
|
1天前
|
XML Android开发 数据格式
Android setContentView源码与原理分析
`setContentView` 是 Activity 显示界面的核心方法,其本质是将布局嵌入由 `PhoneWindow` 管理的 `DecorView` 中。系统首先创建包含状态栏、标题栏等的窗口模板(如 `screen_simple.xml`),再通过 `LayoutInflater` 将开发者指定的布局加载到 ID 为 `android.R.id.content` 的 `mContentParent` 容器内,最终在 `Activity` 恢复时由 `WindowManager` 将 `DecorView` 添加至窗口,触发测量与绘制流程,完成界面显示。
100 73
|
1天前
|
设计模式 数据管理 领域建模
【attice-model 】 源码分析
lattice-model 是 Lattice 框架的核心模块,定义了 Ability、Business 等关键领域模型与元数据结构。通过注解驱动、编译期处理与 SPI 扩展机制,实现配置与代码统一、运行时支撑及插件化隔离,为上层提供高扩展、易维护的架构基础。(238 字)
98 69