【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);
    
    // 读取数字压入S1
    for (int i = 0; i < N; i++) {
        int num;
        scanf("%d", &num);
        push(S1, num);
    }
    
    // 读取运算符压入S2
    for (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;
}
### C语言实现四则运算计算器 #### 设计思路 在设计一个简单的四则运算计算器时,主要考虑如何接收用户的输入并处理加法、减法、乘法和除法操作。通常会采用循环结构来持续接受用户命令直到特定终止条件被满足。 #### 示例代码及解析 下面是一个基于控制台的应用程序例子,它实现了基本的四则运算功能: ```c #include <stdio.h> int main() { char operator; double num1, num2; printf("请输入运算符 (+,-,*,/): "); scanf("%c", &operator); printf("请输入两个数字 (a b): "); scanf("%lf %lf", &num1, &num2); switch(operator) { case '+': printf("%.2f + %.2f = %.2f\n", num1, num2, num1 + num2); break; case '-': printf("%.2f - %.2f = %.2f\n", num1, num2, num1 - num2); break; case '*': printf("%.2f * %.2f = %.2f\n", num1, num2, num1 * num2); break; case '/': if(num2 != 0){ printf("%.2f / %.2f = %.2f\n", num1, num2, num1 / num2); } else { printf("错误:分母不能为零。\n"); } break; default: printf("未知的操作符.\n"); } return 0; } ``` 此段代码首先包含了标准输入输出库 `#include <stdio.h>`[^3] ,接着定义了一个名为`main()` 的函数作为程序入口点。通过使用 `scanf()` 函数读取用户提供的运算符以及参与计算的数值;再利用 `switch-case` 结构判断具体执行哪种类型的运算法则,并最终打印出相应的结果给用户查看。 对于更复杂的表达式求解或是支持括号优先级的情况,则可能需要用到栈(Stack)数据结构或其他高级算法来进行解析与评估。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

秋说

感谢打赏

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值