L2-1 简单计算器 (25 分)详解c语言 模拟堆栈

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

https://images.ptausercontent.com/7a19b25d-2a56-49dc-bbc4-698c8b1db505.jpg

本题要求你为初学数据结构的小伙伴设计一款简单的利用堆栈执行的计算器。如上图所示,计算器由两个堆栈组成,一个堆栈 S​1存放数字,另一个堆栈
S​2 存放运算符。计算器的最下方有一个等号键,每次按下这个键,计算器就执行以下操作:从S ​1中弹出两个数字,顺序为 n​1和 n2 ;从 S​2中弹出一个运算符 op;执行计算 n​2 op n​1 ;
将得到的结果压回 S1​​ 。直到两个堆栈都为空时,计算结束,最后的结果将显示在屏幕上。

输入格式:

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

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

输出格式:

将输入的数字和运算符按给定顺序分别压入堆栈 S ​1 ​​ 和 S ​2
将执行计算的最后结果输出。注意所有的计算都只取结果的整数部分。题目保证计算的中间和最后结果的绝对值都不超过 10 ​ 9 10​^9 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>
int digit(int a,int b,char c)//计算操作
{
	if(c=='+')return  a+b;
	if(c=='-')return a-b;
	if(c=='*')return a*b;
	if(c=='/'&&b==0)
		return -199;//如果出错就返回199;继续后续的ERROR打印
	if(c=='/')return a/b;
	else return 0;
}
int main()
{
	int n;
	scanf("%d",&n);
	int a[n];
	char b[n-1];
	for(int i=0;i<n;i++)
		scanf("%d",&a[i]);
	getchar();//要用getchar吸收空格和回车,一开始搞错了,找了很久的错误。
	for(int i=0;i<n-1;i++)
	{
		scanf("%c",&b[i]);
		getchar(); 
	}
	int sum=0;
	int p = n-2;//p是字符数组的下标,因为有n-1个元素,所以末尾元素是n-2
	
	for(int i=n-1;i>0;i--)
	{	
		int tem = a[i-1];
		a[i-1] = digit(a[i-1],a[i],b[p]);//计算后两位,然后结果给到倒数第二位
		p--;
		if(a[i-1]==-199)//哎,等于-199说明错误啦,所以输出然后直接返回。tem是为了存i-1的数值
													//不然i-1就是-199啦,就会错的一塌糊涂。
		{
			printf("ERROR: %d/%d",tem,a[i]);
			return 0;
		}
	}
	printf("%d",a[0]);//全部计算完之后就只剩下a[0]啦
}

在这里插入图片描述

全红很不错

#include<bits/stdc++.h>//c++就比较简单了
using namespace std;

int c(int a,int b,char c)
{
	if(c=='+')return  a+b;
	if(c=='-')return a-b;
	if(c=='*')return a*b;
	if(c=='/')return a/b;
	else return 0;
}

int main()
{
	int n;cin>>n;
	stack<int>a;//数字栈 
	stack<char>b;//符号栈 
	for(int i=0;i<n;i++)
	{
		int tem;cin>>tem;
		a.push(tem);
	 } 
	 for(int i=0;i<n-1;i++)
	 {
	 	char tem;cin>>tem;
	 	b.push(tem);
	 }
	 for(int i=0;i<n-1;i++)
	 {
	 	int x1 = a.top();a.pop();
	 	int x2 = a.top();a.pop();
	 	char x3 = b.top();b.pop();
	 	if(x1==0&&x3=='/')
	 	{
	 		cout<<"ERROR: "<<x2<<"/"<<x1;
	 		return 0;
		 }
	 	a.push(c(x2,x1,x3));
		
	 }
	  cout<<a.top()<<endl;
}
  • 8
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值