【PTA数据结构 | C语言版】后缀表达式求值

本专栏持续输出数据结构题目集,欢迎订阅。

文章目录

题目

请编写程序,求给定的后缀表达式的值。

输入格式:

输入在一行中给出一个非空后缀表达式,其中操作数为 int 型整数,操作符包括加、减、乘、除、取模。各项之间以空格分隔。表达式字符串(包括空格)长度小于 1000。题目保证正确计算的过程中不会产生溢出。

输出格式:

在一行中输出后缀表达式的值。注意全部计算都是整数运算,结果仅取整数。

以下情况需要输出错误信息:

计算除法时发现分母为 0,输出 错误:除法操作分母为零。;

计算取模时发现除数为 0,输出 错误:取模操作除数为零。;

发现表达式错误时,输出 错误:表达式不规范。;

无法正确计算出结果时,输出 10^9。

输入样例 1:

23 16 18 2 * 11 / 117 5 % + - +

输出样例 1:

34

输入样例 2:

23 0 %

输出样例 2:

错误:取模操作除数为零。

1000000000

代码

cpp 复制代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

#define MAX_STACK_SIZE 1000
#define ERROR_VALUE 1000000000

typedef struct {
    int data[MAX_STACK_SIZE];
    int top;
} Stack;

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

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

void push(Stack *s, int value) {
    s->data[++(s->top)] = value;
}

int pop(Stack *s) {
    return s->data[(s->top)--];
}

int peek(Stack *s) {
    return s->data[s->top];
}

int main() {
    Stack stack;
    initStack(&stack);
    
    char token[1000];
    int error = 0;
    
    // 读取输入直到行尾
    while (scanf("%s", token) != EOF) {
        // 判断是否为操作数
        if (isdigit(token[0]) || (token[0] == '-' && isdigit(token[1]))) {
            int num = atoi(token);
            push(&stack, num);
        } 
        // 判断是否为操作符
        else if (strlen(token) == 1) {
            char op = token[0];
            if (op == '+' || op == '-' || op == '*' || op == '/' || op == '%') {
                if (stack.top < 1) {
                    error = 1;
                    break;
                }
                
                int b = pop(&stack);
                int a = pop(&stack);
                int result;
                
                switch (op) {
                    case '+':
                        result = a + b;
                        break;
                    case '-':
                        result = a - b;
                        break;
                    case '*':
                        result = a * b;
                        break;
                    case '/':
                        if (b == 0) {
                            printf("错误:除法操作分母为零。\n");
                            printf("%d\n", ERROR_VALUE);
                            return 0;
                        }
                        result = a / b;
                        break;
                    case '%':
                        if (b == 0) {
                            printf("错误:取模操作除数为零。\n");
                            printf("%d\n", ERROR_VALUE);
                            return 0;
                        }
                        result = a % b;
                        break;
                    default:
                        error = 1;
                        break;
                }
                
                if (error) break;
                push(&stack, result);
            } else {
                error = 1;
                break;
            }
        } else {
            error = 1;
            break;
        }
    }
    
    // 检查表达式是否规范
    if (error || stack.top != 0) {
        printf("错误:表达式不规范。\n");
        printf("%d\n", ERROR_VALUE);
        return 0;
    }
    
    // 输出结果
    printf("%d\n", pop(&stack));
    return 0;
}    
相关推荐
To_OC18 小时前
LC 994 腐烂的橘子:人人都说是 BFS 入门题,我却写了三遍才过
javascript·算法·leetcode
金銀銅鐵1 天前
[Python] 扩展欧几里得算法
python·数学·算法
To_OC1 天前
LC 200 岛屿数量:经典 DFS 入门题,我第一次写居然连方向都搞错了
javascript·算法·leetcode
To_OC2 天前
LC 128 最长连续序列:别上来就排序,O (n) 解法才是这题的灵魂
javascript·算法·leetcode
刘马想放假2 天前
Modbus 全栈技术解析:TCP、RTU、ASCII、RTU over TCP
数据结构·网络协议
05Kevin2 天前
lk每日冒险题--数据结构6.27
算法
To_OC3 天前
从一次栈溢出报错说起,我把递归彻底扒明白了
javascript·算法·程序员
千纸鹤安安3 天前
千问Qwen-AgentWorld来了:一个语言模型搞定七大Agent场景,GPT-5.4都输了
算法