【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;
}    
相关推荐
纪元A梦3 小时前
贪心算法应用:信用评分分箱问题详解
java·算法·贪心算法
啟明起鸣3 小时前
【网络编程】从与 TCP 服务器的对比中探讨出 UDP 协议服务器的并发方案(C 语言)
服务器·c语言·开发语言·网络·tcp/ip·udp
I'm a winner4 小时前
第五章:Python 数据结构:列表、元组与字典(一)
开发语言·数据结构·python
过河卒_zh15667664 小时前
9.13AI简报丨哈佛医学院开源AI模型,Genspark推出AI浏览器
人工智能·算法·microsoft·aigc·算法备案·生成合成类算法备案
D.....l4 小时前
冒泡排序与选择排序以及单链表与双链表
数据结构·算法·排序算法
欧阳天风4 小时前
链表运用到响应式中
javascript·数据结构·链表
番茄灭世神4 小时前
柔性数组与队列杂记
c语言
nightunderblackcat4 小时前
新手向:C语言、Java、Python 的选择与未来指南
java·c语言·python
sinat_286945194 小时前
Case-Based Reasoning用于RAG
人工智能·算法·chatgpt