PTA7-1 简单计算器 (25 分)

PTA7-1 简单计算器 (25 分)

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

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

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

输入格式:

输入首先在第一行给出正整数 N(1<N≤103),为 S1​ 中数字的个数。

第二行给出 N 个绝对值不超过 100 的整数;第三行给出 N−1 个运算符 —— 这里仅考虑 +-*/ 这四种运算。一行中的数字和符号都以空格分隔。

输出格式:

将输入的数字和运算符按给定顺序分别压入堆栈 S1​ 和 S2​,将执行计算的最后结果输出。注意所有的计算都只取结果的整数部分。题目保证计算的中间和最后结果的绝对值都不超过 109。

如果执行除法时出现分母为零的非法操作,则在一行中输出:ERROR: X/0,其中 X 是当时的分子。然后结束程序。

输入样例 1:

5
40 5 8 3 2
/ * - +

输出样例 1:

2

输入样例 2:

5
2 5 8 4 4
* / - +

输出样例 2:

ERROR: 5/0

解题思路: 

​#include <stdio.h>
//#include <string.h>
#include <stdlib.h>
struct S
{
    int*Data;
    int Top;
    int Max;
};
typedef struct  S*Stack;

Stack CreateStack(int Max)
{
    Stack S = (Stack)malloc(sizeof(struct S));
    S->Data=(int*)malloc(Max* sizeof(int));
    S->Top=-1;
    S->Max=Max;
    return S;//5步创建 
};
 
bool isFull(Stack S)
{
    return (S->Top==S->Max-1);
}
 
bool Push(Stack S,int X)
{
    if(isFull(S))
    {
        return false;
    }
    else {
        S->Data[++(S->Top)]=X;
        return true;
    }
}
 
bool IsEmpty (Stack S)
{
    return (S->Top==-1);
}
 
int Pop(Stack S)
{
    if(IsEmpty(S))
    {
        printf("堆栈空\n");
    }
    else{
        return (S->Data[(S->Top)--]);
    }
}
 
int main()
{
	int n=0;//总长度 
	scanf("%d", &n);
	
    Stack z;//生成栈 
	z= CreateStack(n);
    
	int result;
    int a=0; 
    int i,j;
    
    char ysf[n];//存放运算符
    
    for(i=0;i<n;i++)
    {
        scanf("%d",&a);
        Push(z,a);
    }// 输入n个数 
    for(j=0;j<n-1;j++)
    {
        scanf(" %c",&ysf[j]);
    } 

    for(j=n-2;j>=0;j--)
    {
        int n1,n2;
        n1=Pop(z);
        n2=Pop(z);
        if(ysf[j]=='+')
        {
            n2=n1+n2;
            Push(z,n2);
        }
		else if(ysf[j]=='*')
        {
            n2=n2*n1;
            Push(z,n2);
        }
        else if(ysf[j]=='-')
        {
            n2=n2-n1;
            Push(z,n2);
		}      
        else //if(ysf[j]='/')
        {
            if (n1==0)
            {
                printf("ERROR: %d/0\n",n2);
                return 0;
            }
            else
            {
                n2=n2/n1;
                Push(z,n2);
            }   
        }
    }
    result =Pop(z);
    printf("%d",result);
    return 0;
}

​

​

### PTA 题目 7-2 简易计算器解析 PTA 题目 7-2 要求设计一个简易计算器程序,能够处理基本的四则运算操作(加法、减法、乘法和除法)。以下是该题目现思路以及代码示例。 #### 功能需求析 简易计算器的核心功能是对两个输入数值执行指定的操作符计算。具体来说,用户需提供三个参数:第一个数 `a`、第二个数 `b` 和操作符 `op`。支持的操作符包括 `'+'`, `'-'`, `'*'`, `'/'`。对于非法输入或特殊情形(如除零错误),应返回相应的提示信息[^1]。 #### 设计方案 为了完成此任务,可以采用如下逻辑结构: 1. 接收用户的输入数据; 2. 判断输入的有效性并验证操作符合法性; 3. 执行对应的算术运算; 4. 输出结果或者异常消息。 下面是一个 Python 的解决方案: ```python def simple_calculator(): try: a, op, b = input().split() # 输入形如 "num1 operator num2" a, b = float(a), float(b) # 将字符串转换成浮点数 if op == '+': result = a + b elif op == '-': result = a - b elif op == '*': result = a * b elif op == '/': if b != 0: # 检查母是否为零 result = a / b else: return 'Divided by zero!' else: return 'Invalid operation!' # 如果不是合法的操作符,则报错 return f'{result:.2f}' # 返回保留两位小数的结果 except Exception as e: return 'Error occurred during calculation!' print(simple_calculator()) ``` 上述代码现了对标准输入流中的三部——两数及其间的一个二元运算符——进行读取,并依据给定条件完成了相应计算[^2]。注意这里采用了异常捕获机制来增强健壮性;当遇到无法预料的情况时,比如不恰当的数据类型转化尝试,函数会优雅退出而不是崩溃。 #### 测试案例 考虑几个典型的测试场景可以帮助确认算法行为符合预期: | **Input** | **Output** | |-------------------|------------------| | `5 + 8` | `13.00` | | `-7 * 3` | `-21.00` | | `9 / 0` | `Divided by zero!` | | `abc - def` | `Error occurred during calculation!` | 以上表格展示了不同情况下的表现特征[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值