【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;
}    
相关推荐
Y1nhl1 小时前
力扣_二叉树的BFS_python版本
python·算法·leetcode·职场和发展·宽度优先
学不动CV了1 小时前
ARM单片机OTA解析(一)
c语言·arm开发·stm32·单片机·嵌入式硬件·51单片机
syzyc2 小时前
[ABC267F] Exactly K Steps
数据结构·动态规划·题解
向阳逐梦2 小时前
PID控制算法理论学习基础——单级PID控制
人工智能·算法
2zcode3 小时前
基于Matlab多特征融合的可视化指纹识别系统
人工智能·算法·matlab
Owen_Q3 小时前
Leetcode百题斩-二分搜索
算法·leetcode·职场和发展
矢志航天的阿洪3 小时前
蒙特卡洛树搜索方法实践
算法
草莓熊Lotso4 小时前
【数据结构初阶】--顺序表(二)
c语言·数据结构·经验分享·其他
汤姆爱耗儿药4 小时前
数据结构——散列表
数据结构·散列表
UnderTheTime4 小时前
2025 XYD Summer Camp 7.10 筛法
算法