当前位置: 首页 > news >正文

简单实现逆波兰表达式求值

  • isdigit(c):判断字符 c 是否为数字(0-9 ) ,是则返回非零值,否则返回 0 。例如 '7' 传入返回非零,'x' 传入返回 0 。

 

#include <stdio.h>
#include <ctype.h>

#define SZ 100
// 用数组模拟栈
int stack[SZ], top = -1;

// 压栈
void push(int n) { stack[++top] = n; }

// 出栈
int pop() { return stack[top--]; }

int rpnEval(char* s) {
    while (*s) {
        if (isdigit(*s))
            push(*s - '0');
        else {
            int b = pop(), a = pop();
            switch (*s) {
                case '+': push(a + b); break;
                case '-': push(a - b); break;
                case '*': push(a * b); break;
                case '/': push(a / b); break;
            }
        }
        s++;
    }
    return pop();
}

int main() {
    char expr[SZ];
    scanf("%s", expr);
    printf("%d\n", rpnEval(expr));
    return 0;
}

 

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>

#define MAX_SIZE 1000
// 定义栈的结构
typedef struct SqStack {
    int data[MAX_SIZE];
    int top;
} SqStack;

// 栈的初始化
void InitStack(SqStack* S) {
    S->top = -1;
}

// 压栈
void Push(SqStack* S, int e) {
    S->data[++(S->top)] = e;
}

// 出栈
int Pop(SqStack* S) {
    return S->data[(S->top)--];
}

// 逆波兰表达式求值
int rpnEvaluate(char* expr) {
    SqStack stack;
    InitStack(&stack);
    char* token = expr;
    while (*token != '\0') {
        if (isdigit(*token)) {
            int num = 0;
            while (isdigit(*token)) {
                num = num * 10 + (*token - '0');
                token++;
            }
            Push(&stack, num);
            token--;
        } else if (isspace(*token)) {
            token++;
            continue;
        } else {
            int op2 = Pop(&stack);
            int op1 = Pop(&stack);
            switch (*token) {
                case '+':
                    Push(&stack, op1 + op2);
                    break;
                case '-':
                    Push(&stack, op1 - op2);
                    break;
                case '*':
                    Push(&stack, op1 * op2);
                    break;
                case '/':
                    Push(&stack, op1 / op2);
                    break;
            }
            token++;
        }
        token++;
    }
    return Pop(&stack);
}

int main() {
    char expr[MAX_SIZE];
    scanf("%s", expr);
    int result = rpnEvaluate(expr);
    printf("%d\n", result);
    return 0;
}

相关文章:

  • C++_智能指针
  • 如何从零构建一个自己的 CentOS 基础镜像
  • WinForm真入门(14)——ListView控件详解
  • Work Experience
  • java相关技术总结
  • 在 openEuler 24.03 (LTS) 操作系统上添加 ollama 作为系统服务的步骤
  • 如何在Android系统上单编ko?
  • c++基础知识二
  • 剑指offer经典题目(三)
  • 基于springboot的“协同过滤算法的高考择校推荐系统”的设计与实现(源码+数据库+文档+PPT)
  • 使用模板报错:_G.unicode.len(orgline.text_stripped:gsub(“ “,““))
  • JavaScript保留小数位及提示toFixed未定义
  • 解决文件夹解压中文字符产生乱码的问题
  • SQLI漏洞公开报告分析
  • JS 数组解构
  • 无人机飞控的二次开发,视觉定位
  • 空杯见月,满杯见己
  • 全文 - MLIR Toy Tutorial Chapter 4: 使用 interfaces 开启 通用变换
  • C++怎么调用类中的函数
  • 阿里云CDN应对DDoS攻击策略