简单计算器-栈
简单计算器
一、目的
-掌握stack用法
-掌握计算器基本原理
二、实验内容与设计思想
简单计算器
本题要求你为初学数据结构的小伙伴设计一款简单的利用堆栈执行的计算器。如上图所示,计算器由两个堆栈组成,一个堆栈S1存放数字,另一个堆栈S2存放运算符。计算器的最下方有一个等号键,每次按下这个键,计算器就执行以下操作:
1.从S1中弹出两个数字,顺序为n1和n2;
2.从S2中弹出一个运算符 op;
3.执行计算 n 2 op n1;
4.将得到的结果压回 S 1。
直到两个堆栈都为空时,计算结束,最后的结果将显示在屏幕上。
输入格式:
输入首先在第一行给出正整数 N(1<N≤10^3),为 S1 中数字的个数。
第二行给出 N 个绝对值不超过 100 的整数;第三行给出 N−1 个运算符 —— 这里仅考虑 +、-、*、/ 这四种运算。一行中的数字和符号都以空格分隔。
输出格式:
将输入的数字和运算符按给定顺序分别压入堆栈 S 1和 S 2,将执行计算的最后结果输出。注意所有的计算都只取结果的整数部分。题目保证计算的中间和最后结果的绝对值都不超过 10^9。
如果执行除法时出现分母为零的非法操作,则在一行中输出:ERROR: X/0,其中 X 是当时的分子。然后结束程序。
输入样例 1:
5
40 5 8 3 2
/ * - +
输出样例 1:
2
输入样例 2:
5
2 5 8 4 4
- / - +
输出样例 2:
ERROR: 5/0
函数相关伪代码
1.stack<int>s1,stack<char>s2用于存储数字和符号
2.循环入栈
3.循环判断入栈条件,即出栈两个值和一个符号来判断下一个入栈数,到s1或s2有一个为空
4.在循环里,除法时判断分母不能为0,分母为0要报错
5.如果s1为空表示没有结果,不为空输出(结果)
函数代码
#include<iostream>
#include<stack>
using namespace std;
int main()
{
stack<int> s1;
stack<char> s2;
int n,i,a;
char c;
cin >> n;
for (i = 0;i < n;i++)
{
cin >> a;
s1.push(a);
}
for (i = 0;i < n - 1;i++)
{
cin >> c;
s2.push(c);
}
while (!s1.empty() && !s2.empty())
{
int n1 = s1.top();
s1.pop();
int n2 = s1.top();
s1.pop();
char op = s2.top();
s2.pop();
if (op == '+')
s1.push(n2 + n1);
else if (op == '-')
s1.push(n2 - n1);
else if (op == '*')
s1.push(n2 * n1);
else
{
if (n1 == 0)
{
cout << "ERROR: " << n2 << "/" << n1;
return 0;
}
s1.push(n2 / n1);
}
}
if (!s1.empty())
cout << s1.top();
else
cout << "ERROR: No result";
}
三、实验使用环境
以下请根据实际情况编写
- 操作系统:Windows 11专业版
- 编程语言:C++
- 开发工具:[Visual Studio 2022]
四、实验步骤和调试过程
简单计算器
本机运行截图
五、实验小结
遇到的问题及解决方法:
- 问题:stack未正确使用
- 解决方法:修改代码,改正方法
实验体会和收获:
程序利用栈数据结构实现了一个简单的逆波兰表达式计算器。用户首先输入数字的个数,然后输入相应数量的整数,这些整数被存储在整数栈s1中。接着,输入操作符,这些操作符被存储在字符栈s2中。程序通过弹出栈顶元素进行运算,并将结果压回栈中。
程序先使用两个循环分别读取数字和操作符,然后进入一个while循环,只要两个栈都不为空,就进行运算。从s1中弹出两个数字,从s2中弹出一个操作符,根据操作符来判断进行加、减、乘、除运算。如果遇到除数为0的情况,程序会输出错误信息并终止。程序对除数为0的情况进行了特殊处理,如果发生这种情况,会输出"ERROR: x(当时的分子)/0,并返回0终止程序。循环结束后,如果所有运算正常完成,那么s1中只会有一个元素,则输出该元素作为结果。如果s1为空,说明没有有效结果,输出"ERROR: No result"。