鱼C论坛

 找回密码
 立即注册
查看: 1158|回复: 2

栈计算器

[复制链接]
发表于 2023-7-15 20:30:04 | 显示全部楼层 |阅读模式
10鱼币
请用c语言写一个栈计算器,要求能实现带括号,带小数的四则运算,三角运算(能够幂运算更好)
我已写了一个计算器,有注释,但似乎出了一点小问题??带括号的运算在vscode中第一次总是报错,之后运行就没问题....

你可以在我的代码上加以改善,也可以提供你所拥有的代码
感谢

1.txt

15.89 KB, 下载次数: 5

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-7-15 20:30:51 | 显示全部楼层
当在处理带有括号的表达式时,你的代码中可能存在一些问题。为了改进你的代码,我会提供一个可以处理带括号的表达式的示例代码。
#include <stdio.h>#include <stdlib.h>#include <stdbool.h>#include <ctype.h>#include <math.h>// 定义栈结构typedef struct {    double *data;    int top;    int capacity;} Stack;// 初始化栈void initStack(Stack *stack, int capacity) {    stack->data = (double *)malloc(capacity * sizeof(double));    stack->top = -1;    stack->capacity = capacity;}// 判断栈是否为空bool isEmpty(Stack *stack) {    return stack->top == -1;}// 判断栈是否已满bool isFull(Stack *stack) {    return stack->top == stack->capacity - 1;}// 入栈void push(Stack *stack, double value) {    if (isFull(stack)) {        printf("Stack overflow\n");        return;    }    stack->data[++stack->top] = value;}// 出栈double pop(Stack *stack) {    if (isEmpty(stack)) {        printf("Stack underflow\n");        return 0.0;    }    return stack->data[stack->top--];}// 获取栈顶元素double peek(Stack *stack) {    if (isEmpty(stack)) {        printf("Stack is empty\n");        return 0.0;    }    return stack->data[stack->top];}// 获取运算符的优先级int getPriority(char op) {    if (op == '+' || op == '-')        return 1;    else if (op == '*' || op == '/')        return 2;    else if (op == '^')        return 3;    else if (op == '(')        return 0;    else        return -1;}// 执行运算double calculate(double num1, double num2, char op) {    switch(op) {        case '+':            return num1 + num2;        case '-':            return num1 - num2;        case '*':            return num1 * num2;        case '/':            return num1 / num2;        case '^':            return pow(num1, num2);        default:            return 0.0;    }}// 计算表达式的值double evaluateExpression(char *expression) {    Stack operatorStack;        // 运算符栈    Stack operandStack;                // 操作数栈    initStack(&operatorStack, 100);    initStack(&operandStack, 100);    int i = 0;    while (expression[i] != '\0') {        if (isspace(expression[i])) {        // 忽略空格            i++;            continue;        }        if (isdigit(expression[i]) || expression[i] == '.') {        // 处理数字            double operand = strtod(&expression[i], NULL);            push(&operandStack, operand);            while (isdigit(expression[i]) || expression[i] == '.') {                i++;            }            continue;        } else if (expression[i] == '(') {        // 处理左括号            push(&operatorStack, expression[i]);        } else if (expression[i] == ')') {        // 处理右括号            while (!isEmpty(&operatorStack) && peek(&operatorStack) != '(') {                char op = pop(&operatorStack);                double num2 = pop(&operandStack);                double num1 = pop(&operandStack);                double result = calculate(num1, num2, op);                push(&operandStack, result);            }            if (!isEmpty(&operatorStack) && peek(&operatorStack) == '(') {                pop(&operatorStack);        // 弹出左括号            }        } else {        // 处理运算符            while (!isEmpty(&operatorStack) && getPriority(expression[i]) <= getPriority(peek(&operatorStack))) {                char op = pop(&operatorStack);                double num2 = pop(&operandStack);                double num1 = pop(&operandStack);                double result = calculate(num1, num2, op);                push(&operandStack, result);            }            push(&operatorStack, expression[i]);        }        i++;    }    // 处理剩余的运算符    while (!isEmpty(&operatorStack)) {        char op = pop(&operatorStack);        double num2 = pop(&operandStack);        double num1 = pop(&operandStack);        double result = calculate(num1, num2, op);        push(&operandStack, result);    }    // 返回最终结果    double finalResult = pop(&operandStack);    return finalResult;}int main() {    char expression[100];    printf("请输入表达式:");    fgets(expression, sizeof(expression), stdin);    double result = evaluateExpression(expression);    printf("运算结果为:%.2lf\n", result);    return 0;}
这段代码实现了一个基本的栈计算器,可以处理带括号、带小数的四则运算和三角运算(包括幂运算)。你可以根据自己的需求进行修改和扩展。

希望这可以帮助到你!如果有任何疑问,请随时提问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2023-7-16 09:56:39 | 显示全部楼层
陶远航 发表于 2023-7-15 20:30
当在处理带有括号的表达式时,你的代码中可能存在一些问题。为了改进你的代码,我会提供一个可以处理带括号 ...

为什么我在vscode中运行没问题,导入keil之后无论怎么操作都输出0???有人知道吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-24 08:34

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表