【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;
}    
相关推荐
我带你来这儿就是为了告诉你我2 分钟前
C++23新特性前瞻
开发语言·c++·算法
陌夏6 分钟前
快速排序 (Quick Sort)
算法
罗超驿6 分钟前
Java数据结构_栈_算法题
java·数据结构·
IronMurphy16 分钟前
【算法二十九】 437. 路径总和 III
算法·深度优先
2501_9083298517 分钟前
C++安全编程指南
开发语言·c++·算法
计算机安禾19 分钟前
【C语言程序设计】第39篇:预处理器与宏定义
c语言·开发语言·c++·vscode·算法·visual studio code·visual studio
m0_5698814730 分钟前
C++中的装饰器模式变体
开发语言·c++·算法
笒鬼鬼31 分钟前
【API接口】最新可用红果短剧接口
算法·api·笒鬼鬼·红果短剧·接口源码
weixin_4219226933 分钟前
C++与边缘计算
开发语言·c++·算法
2401_8319207435 分钟前
C++编译期数组操作
开发语言·c++·算法