博客作业03--栈和队列

Posted 榕破

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了博客作业03--栈和队列相关的知识,希望对你有一定的参考价值。

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]

5. 代码Git提交记录截图

以上是关于博客作业03--栈和队列的主要内容,如果未能解决你的问题,请参考以下文章

博客作业03--栈和队列

博客作业03--栈和队列

博客作业03--栈和队列

博客作业03--栈和队列

博客作业03--栈和队列

博客作业03--栈和队列