1.学习总结
1.1 写出你认为本周学习中比较重要的知识点关键词。
- 重要的知识点关键词:数据结构、复杂度、抽象数据类型、线性表、栈和队列、串、算法、逻辑结构、存储结构、基本运算等;
1.2 使用思维导图将这些关键词组织起来。
2.PTA实验作业
2.1 题目名称
题目1:7-2 符号配对(栈)
- 请编写程序检查C语言源程序中下列符号是否配对:/* 与 */、( 与 )、[ 与 ]、{ 与 }
1. 设计思路(伪代码或流程图)
修改前:
修改后:
2.代码截图
3. PTA提交列表截图及说明
- 答案错误。输出只有判断,没有输出相应缺少的符号,取栈顶函数出错,返回值应为 s.data [s.top ] ,而不是s.top;
- 部分正确。样例缺左边,结尾有多余右符号,左右个数等但不匹配,匹配出错,更改函数,栈顶返回s.data [s.top ] 非s.data [s.top-1] ;
2.2 题目名称
题目2:7-1 jmu-报数游戏(队、列)
- 有n个人围成一圈,按顺序从1到n编好号。从第一个人开始报数,报到m(m<n)的人退出圈子;下一个人从1开始报数,报到m的人退出圈子。
1. 设计思路(伪代码或流程图)
修改前:
修改后:
2.代码截图
3. PTA提交列表截图及说明
- 部分正确。m<n时出错,想法出错,没有进行环式循环,应从m的下一个人继续,修改函数代码;
- 编译错误。编译C改成C++;
2.3 题目名称
题目3:7-2 银行业务队列简单模拟(队、列)
- 设某银行有A、B两个业务窗口,且处理业务的速度不一样,其中A窗口处理速度是B窗口的2倍 ,请按业务完成的顺序输出顾客序列;
1. 设计思路(伪代码或流程图)
修改前:
修改后:
2.代码截图
3. PTA提交列表截图及说明
- 格式错误。最后有多余空格;
- 部分正确。最大、最小N格式错误,输入1 5时,前面出现空格,加入flag进行判断输出,当flag=0时无空格,否则加空格,解决;
3.截图本周题目集的PTA最后排名
3.1 栈PTA排名
3.2 队列PTA排名
3.3 我的总分:175
4. 阅读代码
#include <iostream>
#include <algorithm>
#include <cstring>
#include <stack>
#include <cmath>
using namespace std;
char s[1000];
int i; // 字符数组的下标
/* 字符转数字 */
double Translation(int & i)
{
double integer = 0.0; // 整数部分
double remainder = 0.0; // 余数部分
while (s[i] >= \'0\' && s[i] <= \'9\')
{
integer *= 10;
integer += (s[i] - \'0\');
i++;
}
if (s[i] == \'.\')
{
i++;
int c = 1;
while (s[i] >= \'0\' && s[i] <= \'9\')
{
double t = s[i] - \'0\';
t *= pow(0.1, c);
c++;
remainder += t;
i++;
}
}
return integer + remainder;
}
/* 返回运算符级别 */
int GetLevel(char ch)
{
switch (ch)
{
case \'+\':
case \'-\':
return 1;
case \'*\':
case \'/\':
return 2;
case \'(\':
return 0;
case \'#\':
return -1;
};
}
/* 对两个数进行运算 */
double Operate(double a1, char op, double a2)
{
switch (op)
{
case \'+\':
return a1 + a2;
case \'-\':
return a1 - a2;
case \'*\':
return a1 * a2;
case \'/\':
return a1 / a2;
};
}
/* 利用两个栈进行模拟计算 */
double Compute()
{
stack<char> optr; // 操作符栈
stack<double> opnd; // 操作数栈
optr.push(\'#\');
int len = strlen(s);
bool is_minus = true; // 判断\'-\'是减号还是负号
for (i = 0; i < len;)
{
//1. 负号
if (s[i] == \'-\' && is_minus) // 是负号
{
opnd.push(0);
optr.push(\'-\');
i++;
}
//2. 是右括号 )
else if (s[i] == \')\')
{
is_minus = false;
i++;
while (optr.top() != \'(\')
{
double a2 = opnd.top();
opnd.pop();
double a1 = opnd.top();
opnd.pop();
char op = optr.top();
optr.pop();
double result = Operate(a1, op, a2);
opnd.push(result);
}
optr.pop(); // 删除\'(\'
}
//3. 数字
else if (s[i] >= \'0\' && s[i] <= \'9\')
{
is_minus = false;
opnd.push(Translation(i));
}
//4. ( 左括号
else if (s[i] == \'(\')
{
is_minus = true;
optr.push(s[i]);
i++;
}
//5. + - * / 四种
else
{
while (GetLevel(s[i]) <= GetLevel(optr.top()))
{
double a2 = opnd.top();
opnd.pop();
double a1 = opnd.top();
opnd.pop();
char op = optr.top();
optr.pop();
double result = Operate(a1, op, a2);
opnd.push(result);
}
optr.push(s[i]);
i++;
}
}
while (optr.top() != \'#\')
{
double a2 = opnd.top();
opnd.pop();
double a1 = opnd.top();
opnd.pop();
char op = optr.top();
optr.pop();
double result = Operate(a1, op, a2);
opnd.push(result);
}
return opnd.top();
}
int main()
{
while (cin >> s)
cout << "结果为:" << Compute();
cout << endl << endl;
}
- 功能:用栈实现计算器功能
- 优点: 利用两个栈进行模拟计算,一个操作符栈,一个操作数栈,栈的思想,直接进行入栈、出栈操作,代码水平提高,利于课外研究学习;
- 地址:[https://gitee.com/adressad/codes/9ystlgoh6b413n5vfupa839]