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

【PTA数据结构 | C语言版】简单计算器

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

文章目录

    • 题目
    • 代码

题目

在这里插入图片描述

本题要求你为初学数据结构的小伙伴设计一款简单的利用堆栈执行的计算器。如上图所示,计算器由两个堆栈组成,一个堆栈 S1 存放数字,另一个堆栈 S2 存放运算符。计算器的最下方有一个等号键,每次按下这个键,计算器就执行以下操作:

1.从 S1 中弹出两个数字,顺序为 n1 和 n2;
2.从 S2 中弹出一个运算符 op;
3.执行计算 n2 op n1;
4.将得到的结果压回 S1。

直到两个堆栈都为空时,计算结束,最后的结果将显示在屏幕上。

输入格式:
1.输入首先在第一行给出正整数 N(1<N≤10^3),为 S1 中数字的个数。
2.第二行给出 N 个绝对值不超过 100 的整数;第三行给出 N−1 个运算符 —— 这里仅考虑 +、-、*、/ 这四种运算。一行中的数字和符号都以空格分隔。

输出格式:
1.将输入的数字和运算符按给定顺序分别压入堆栈 S1​ 和 S2,将执行计算的最后结果输出。注意所有的计算都只取结果的整数部分。题目保证计算的中间和最后结果的绝对值都不超过 10^9。
2.如果执行除法时出现分母为零的非法操作,则在一行中输出:ERROR: X/0,其中 X 是当时的分子。然后结束程序。

输入样例 1:
5
40 5 8 3 2
/ * - +

输出样例 1:
2

输入样例 2:
5
2 5 8 4 4
* / - +

输出样例 2:
ERROR: 5/0

题目引用自团体程序设计天梯赛真题(2020年)。

代码

#include <stdio.h>
#include <stdlib.h>typedef struct Stack {int *data;int top;int capacity;
} Stack;Stack* createStack(int capacity) {Stack* stack = (Stack*)malloc(sizeof(Stack));stack->data = (int*)malloc(sizeof(int) * capacity);stack->top = -1;stack->capacity = capacity;return stack;
}int isEmpty(Stack* stack) {return stack->top == -1;
}void push(Stack* stack, int value) {stack->data[++stack->top] = value;
}int pop(Stack* stack) {return stack->data[stack->top--];
}int peek(Stack* stack) {return stack->data[stack->top];
}int main() {int N;scanf("%d", &N);Stack* S1 = createStack(N);Stack* S2 = createStack(N-1);// 读取数字压入S1for (int i = 0; i < N; i++) {int num;scanf("%d", &num);push(S1, num);}// 读取运算符压入S2for (int i = 0; i < N-1; i++) {char op[2];scanf("%s", op);push(S2, op[0]);}// 执行计算while (!isEmpty(S2)) {int n1 = pop(S1);int n2 = pop(S1);char op = pop(S2);int result;if (op == '/' && n1 == 0) {printf("ERROR: %d/0\n", n2);free(S1->data);free(S1);free(S2->data);free(S2);return 0;}switch (op) {case '+':result = n2 + n1;break;case '-':result = n2 - n1;break;case '*':result = n2 * n1;break;case '/':result = n2 / n1;break;}push(S1, result);}printf("%d\n", pop(S1));free(S1->data);free(S1);free(S2->data);free(S2);return 0;
}
http://www.dtcms.com/a/277077.html

相关文章:

  • 17.使用DenseNet网络进行Fashion-Mnist分类
  • LabVIEW调用外部DLL
  • 深度学习图像分类数据集—七种树叶识别分类
  • 零基础 “入坑” Java--- 十、继承
  • ARC 03 从Github Action job 到 runner pod
  • PPO(近端策略优化)
  • 华为HarmonyOS 5.0深度解析:跨设备算力池技术白皮书(2025全场景智慧中枢)
  • 【C++】list及其模拟实现
  • C++--List
  • AI交互中的礼貌用语:“谢谢“的效用与代价分析
  • 【操作系统-Day 5】通往内核的唯一桥梁:系统调用 (System Call)
  • MVC 参考手册
  • C++值类别与移动语义
  • linux shell从入门到精通(一)——初识Shell程序
  • opencv中contours的使用
  • Spring Boot RESTful API 设计指南:查询接口规范与最佳实践
  • Docker从环境配置到应用上云的极简路径
  • 【Docker基础】Dockerfile指令速览:文件与目录操作指令详解
  • 【深度学习新浪潮】什么是新视角合成?
  • Python----OpenCV(图像分割——彩色图像分割,GrabCut算法分割图像)
  • 【Linux】线程机制深度实践:创建、等待、互斥与同步
  • ARC 02 runner scale set chart:对接集群与 Github Action 服务器
  • Linux|服务器|二进制部署nacos(不是集群,单实例)(2025了,不允许还有人不会部署nacos)
  • 速通TypeScript装饰器
  • 【windows办公小助手】比文档编辑器更好用的Notepad++轻量编辑器
  • 机器学习sklearn入门:使用KNN模型分类鸢尾花和简单调参
  • 分类问题-机器学习
  • 「小程序开发」项目结构和页面组成
  • Http与Https区别和联系
  • 13. Flink 高可用机制简述(Standalone 模式)