当前位置: 首页 > news >正文

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

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

文章目录

    • 题目
    • 代码

题目

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

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

输出格式:
在一行中输出后缀表达式的值。注意全部计算都是整数运算,结果仅取整数。
以下情况需要输出错误信息:

计算除法时发现分母为 0,输出 错误:除法操作分母为零。;
计算取模时发现除数为 0,输出 错误:取模操作除数为零。;
发现表达式错误时,输出 错误:表达式不规范。;
无法正确计算出结果时,输出 10^9。

输入样例 1:
23 16 18 2 * 11 / 117 5 % + - +

输出样例 1:
34

输入样例 2:
23 0 %

输出样例 2:
错误:取模操作除数为零。
1000000000

代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>#define MAX_STACK_SIZE 1000
#define ERROR_VALUE 1000000000typedef 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;
}    
http://www.dtcms.com/a/275813.html

相关文章:

  • Transforms
  • Spring(四) 关于AOP的源码解析与思考
  • 一文理解缓存的本质:分层架构、原理对比与实战精粹
  • 别再怕 JSON!5分钟带你轻松搞懂这个程序员的好帮手
  • 鸿蒙的NDK开发初级入门篇
  • RISC-V:开源芯浪潮下的技术突围与职业新赛道 (四) 产业应用全景扫描
  • (LeetCode 面试经典 150 题 ) 209. 长度最小的子数组(双指针)
  • Ntfs!LfsFlushLfcb函数分析之while的循环条件NextLbcb的确定和FirstLbcb->LbcbFlags的几种情况
  • docker-compose方式搭建lnmp环境——筑梦之路
  • 【android bluetooth 协议分析 07】【SDP详解 2】【SDP 初始化】
  • Operation Blackout 2025: Smoke Mirrors
  • Windows符号链接解决vscode和pycharm占用C盘空间太大的问题
  • NX二次开发——导入模型是常遇见的问题(导入模型原点的确定导入模型坐标的确定)
  • BERT:双向Transformer革命 | 重塑自然语言理解的预训练范式
  • 深入理解大语言模型:从核心技术到极简实现
  • 洛谷题解 | UVA1485 Permutation Counting
  • jenkins自动化部署前端vue+docker项目
  • 前端面试宝典---项目难点2-智能问答对话框采用虚拟列表动态渲染可视区域元素(10万+条数据)
  • 自动化运维工具jenkins问题
  • Ubuntu安装Jenkins
  • java堆的创建与基础代码解析(图文)
  • Classifier guidance与Classifier-free guidance的原理和公式推导
  • 深大计算机游戏开发实验三
  • 深度学习图像分类数据集—害虫识别分类
  • 分布式数据库系统模式结构深度解析
  • Nginx 中的负载均衡策略
  • 数据统计及透视表
  • 使用Java完成下面项目
  • 引入了模块但没有使用”,会不会被打包进去
  • 【科研绘图系列】R语言绘制小提琴图