【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;
}    
相关推荐
Funny_AI_LAB4 小时前
Naval最新播客谈“氛围编码”:Vibe Coding 开启“一人独角兽”时代
人工智能·算法·语言模型·agi
如何原谅奋力过但无声4 小时前
【灵神高频面试题合集04-05】二分查找
数据结构·python·算法·leetcode
我不是懒洋洋5 小时前
【数据结构】排序算法(直接插入排序、希尔排序、选择排序、堆排序、冒泡排序、快速排序、归并排序、计数排序)
c语言·数据结构·c++·经验分享·算法·排序算法
MediaTea5 小时前
ML:逻辑回归的基本原理与实现
人工智能·算法·机器学习·数据挖掘·逻辑回归
辛苦才能5 小时前
数据结构--排序--插入排序(C语言,重点排序面试和比赛都会考察)
c语言·数据结构·面试
SuperByteMaster13 小时前
keil 工程 .gitignore配置文件
c语言
超级码力66613 小时前
【Latex文件架构】Latex文件架构模板
算法·数学建模·信息可视化
穿条秋裤到处跑13 小时前
每日一道leetcode(2026.04.29):二维网格图中探测环
算法·leetcode·职场和发展
Merlos_wind14 小时前
HashMap详解
算法·哈希算法·散列表
汉克老师14 小时前
GESP2025年3月认证C++五级( 第三部分编程题(1、平均分配))
c++·算法·贪心算法·排序·gesp5级·gesp五级