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;
}
相关文章
|
11月前
|
缓存 NoSQL 关系型数据库
MySQL 与 Redis 如何保证双写一致性?
我是小假 期待与你的下一次相遇 ~
1140 7
SpringCloud极简入门-Feign开启Hystrix
1.支付服务集成Hystrix 官方文档:https://cloud.spring.io/spring-cloud-static/Greenwich.SR5/single/spring-cloud.html#spring-cloud-feign-hystrix 支付服务 springcloud-pay-server-1040 之前集成了Feign,修改该工程集成Hystrix。我们除了要给Feign开启Hystrix以外还需要为Feign接口编写托底类。
769 0
|
11月前
QA1
该程序使用栈检测算术表达式中括号是否匹配。支持圆括号、方括号和花括号,检查配对与嵌套顺序,输入以#结束,输出匹配结果或错误信息。
453 5
|
11月前
|
安全 前端开发 Java
《深入理解Spring》:现代Java开发的核心框架
Spring自2003年诞生以来,已成为Java企业级开发的基石,凭借IoC、AOP、声明式编程等核心特性,极大简化了开发复杂度。本系列将深入解析Spring框架核心原理及Spring Boot、Cloud、Security等生态组件,助力开发者构建高效、可扩展的应用体系。(238字)
|
3月前
|
存储 人工智能 弹性计算
阿里云产品与AI产品组合购活动更新:最新套餐配置与组合购价格参考
阿里云产品组合购活动更新,涵盖AI产品与云产品两大板块,覆盖90%+上云场景。AI产品组合购包含Open Claw经典套餐(78元起)、AI Agent搭建全套餐(112元起)、PAI ArtLab生图套餐(112.98元起)等,支持从个人助理到企业级Agent的快速部署。云产品组合购包含经典"99"计划、0代码建站套餐(域名低至1元)、安全加速全家桶、视频直播全链路服务等,适合个人开发者及企业用户按需选购。
|
11月前
|
机器学习/深度学习 人工智能 监控
智能的三重境界:从感知、认知到决策的进化
智能的三重境界:从感知、认知到决策的进化
1238 121
|
11月前
|
存储 自然语言处理 测试技术
开源嵌入模型对比:让你的RAG检索又快又准
嵌入是RAG系统的核心,将文本转化为语义向量,实现基于含义的检索。本文详解嵌入原理、关键参数及主流开源模型,助你根据分块大小、语言需求和性能约束,选择最合适的嵌入方案,提升RAG效果。
2394 5
开源嵌入模型对比:让你的RAG检索又快又准
|
11月前
QA2
本示例演示循环队列的FIFO操作,通过front、rear和count指针变化展示入队、出队过程,直观呈现队列状态与数据流动,帮助理解队列的工作原理及边界处理。
478 2
|
11月前
|
安全 Java 决策智能
Spring Boot自动装配
Spring Boot自动装配基于“约定优于配置”理念,通过条件化配置与Starters机制,智能推断并加载所需组件,大幅简化开发流程。它实现配置自动化,提升效率,降低维护成本,支持自定义扩展,推动微服务快速构建,是Java生态中开发范式的革新之作。(238字)
|
存储 C语言
`scanf`是C语言中用于按格式读取标准输入的函数
`scanf`是C语言中用于按格式读取标准输入的函数,通过格式字符串解析输入并存入指定变量。需注意输入格式严格匹配,并建议检查返回值以确保读取成功,提升程序健壮性。
1628 0