XCOSnTh平台制作计算器2

#include 
#include 
#include 
#include 
#include 

#define MAX_SIZE 200

typedef struct {
    double data[MAX_SIZE];
    int top;
} Stack;

void initStack(Stack *s) {
    s->top = -1;
}

int isFull(Stack *s) {
    return s->top == MAX_SIZE - 1;
}

int isEmpty(Stack *s) {
    return s->top == -1;
}

void push(Stack *s, double item) {
    if (!isFull(s)) {
        s->data[++(s->top)] = item;
    }
}

double pop(Stack *s) {
    if (!isEmpty(s)) {
        return s->data[(s->top)--];
    }
    return (double)NAN; // 返回NaN表示错误
}

double peek(Stack *s) {
    if (!isEmpty(s)) {
        return s->data[s->top];
    }
    return (double)NAN;
}

double applyOp(double a, double b, char op) {
    switch (op) {
        case '+': return a + b;
        case '-': return a - b;
        case '*': return a * b;
        case '/': 
            if(b != 0) return a / b;
            else printf("Error: Division by zero!\n");
            return (double)NAN;
        case '^': return pow(a, b);
        default: return (double)NAN;
    }
}

// 获取运算符优先级
int precedence(char op) {
    if(op == '+' || op == '-') return 1;
    if(op == '*' || op == '/') return 2;
    if(op == '^') return 3; // 指数运算具有更高的优先级
    return 0;
}

double evaluate_expression(const char* expression) {
    Stack values, ops;
    initStack(&values);
    initStack(&ops);

    for (int i = 0; expression[i] != '\0'; ) {
        if (isspace(expression[i])) {
            i++;
            continue;
        }

        // 处理数字
        if (isdigit(expression[i]) || expression[i] == '.') {
            char *end;
            double number = strtod(expression + i, &end);
            push(&values, number);
            i += end - (expression + i); // 更新索引到解析结束的位置
            continue;
        }

        // 处理左括号
        if (expression[i] == '(') {
            push(&ops, expression[i]);
        }
        // 处理右括号
        else if (expression[i] == ')') {
            while (!isEmpty(&ops) && peek(&ops) != '(')
                push(&values, applyOp(pop(&values), pop(&values), pop(&ops)));
            if (!isEmpty(&ops)) pop(&ops); // 移除 '('
        }
        // 处理运算符
        else if (expression[i] == '+' || expression[i] == '-' ||
                 expression[i] == '*' || expression[i] == '/' || expression[i] == '^') {
            while (!isEmpty(&ops) && precedence(peek(&ops)) >= precedence(expression[i])) {
                push(&values, applyOp(pop(&values), pop(&values), pop(&ops)));
            }
            push(&ops, expression[i]);
        }
        i++;
    }

    // 应用剩余的运算符
    while (!isEmpty(&ops))
        push(&values, applyOp(pop(&values), pop(&values), pop(&ops)));

    return peek(&values);
}

#include"XCOSnTh.h"
static int TestCmd(CmdObj obj ,char *str,int len)
{
    str[len]=0;
    double result = evaluate_expression(str);
    // 输出结果
    obj->printf("Result: %f\n", result);
    
    return 0;
}
CmdDef(test,0,TestCmd,"");

你可能感兴趣的:(#,纯软件,算法,单片机,嵌入式硬件)