Github链接:https://github.com/MeKChen2/object-oriented/tree/master/Calculator
看到题目的时候,一脸懵逼,毫无头绪。所以我先查找了queue的相关资料,整理学习之后开始第一次尝试。
第一次写这道题的时候,我定义了一个队列和一个字符数组,先通过函数从键盘上键入字符,测出字符数组长度,然后用循环将数组存入队列,再依次输出。
1.遇到了第一个问题,相邻数字间也分开了。
我想到加上一个判断条件,根据ASCII码的大小判断是否多输出一个回车。
2.遇到第二个问题:当运输符和前括号连接在一起时会多输出一行空行。
再加上几个判断条件,输出情况不同,最后调整到输出正确的情况。
3.此时主要的部分写好,但是还不满足第五点要求中的1)和2),再进一步修改代码。
这一步添加一个循环与一个判断条件就做到了。
4.这时候重新看了一遍题目,发现题目所用到的是string,而我用的是字符数组,不符合题目的意思,重新修改代码
将输入变成输入一个字符串,再转变为字符数组。
5.代码完成,多组数据测试后没出现错误。代码如下。
#include <iostream>
#include <string>
#include <queue>
using namespace std;
class Scan
{
public:
queue<char>ToStringQueue(string input);
string tin;
};
class Print
{
public:
void getprint(queue<char>str);
};
queue<char>Scan::ToStringQueue(string input)
{
queue<char>str;
char s[50]; //字符数组,用于存放字符串的每一个字符
cout << "Please input a string" << endl;
cin >> input;//输入字符串,当输入是Enter键时结束输入
for (int m = 0; m < 50; m++)
{
s[m] = input[m];//将字符串变为字符数组
}
int n = strlen(s);//测出字符数组的长度
int i, j = 0;
for (i = 0; i < n; i++)
{
str.push(s[i]);
if (s[i] >= 48 && s[i] <= 57)
{
j++;//如果输入是数字,则j++,以此判断是否超过十位数字
}
}
if(j>=11)
{
cout << "ERROR!" <<endl;//当j>=11,即有超过10位数字时,程序报错
exit(0);
}
return str;
}
void Print::getprint(queue<char>str)
{
while (!str.empty())
{
if (str.front() >= 48 && str.front() <= 57)
{
cout << str.front();//输出队首元素
str.pop(); //删除队首元素
}
else if (str.front() != 40 && str.front() != 41 && str.front() != 46)
{
cout << endl;
cout << str.front() << endl;
str.pop();
}
else if (str.front() == 40)
{
cout << str.front() << endl;
str.pop();
}
else if (str.front() == 41)
{
cout << endl << str.front();
str.pop();
}
else
{
cout << str.front();
str.pop();
}
}
cout << endl;
}
int main()
{
Scan sc;
Print pr;
queue<char>str;
str = sc.ToStringQueue(sc.tin);
pr.getprint(str);
system("pause");
return 0;
}
反思:对于queue的知识没有掌握的非常好,有许多知识一开始只是能得到结果就去使用,而没有搞清楚知识的要点,原理。写完代码后浏览了别人的代码,觉得自己这次写的代码过于复杂,应该能够更加简化。