当前位置: 首页 > 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.lryc.cn/news/586673.html

相关文章:

  • 【Linux】线程机制深度实践:创建、等待、互斥与同步
  • 详解Linux下多进程与多线程通信(二)
  • ARC 02 runner scale set chart:对接集群与 Github Action 服务器
  • linux上的软挂载操作方法
  • DAY02:【ML 第一弹】KNN算法
  • 分类问题-机器学习
  • 掌握系统设计的精髓:12个核心设计模式的通俗解读
  • NW756NW815美光固态闪存NW821NW828
  • 设计模式深度解析:单例、工厂、适配器与代理模式
  • 【leetcode】字符串,链表的进位加法与乘法
  • 5G NR PDCCH之处理流程
  • Web攻防-PHP反序列化原生内置类Exception类SoapClient类SimpleXMLElement
  • 预处理器完整功能介绍和示例演示(LESS/SCSS)
  • MYSQL笔记1
  • RabbitMQ队列的选择
  • 微信小程序案例 - 本地生活(首页)
  • CCS-MSPM0G3507-6-模块篇-OLED的移植
  • 什么时候需要用到 multiprocessing?
  • 深度学习图像分类数据集—猫七种表情识别分类
  • Android 响应式编程完整指南:StateFlow、SharedFlow、LiveData 详解
  • MySQL 的 `EXPLAIN` 输出中,`filtered` 属性使用
  • spring--@Autowired
  • spring-ai-alibaba 1.0.0.2 学习(十六)——多模态
  • Java_Springboot技术框架讲解部分(二)
  • Infoblox NetMRI 远程命令执行漏洞复现(CVE-2025-32813)
  • 基于 CentOS 7 的 LVS+DR+Web+NFS 旅游攻略分享平台部署
  • linux中at命令的常用用法。
  • Vue配置特性(ref、props、混入、插件与作用域样式)
  • DHS及HTTPS工作过程
  • 【Java Stream】基本用法学习