• 博客作业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提交记录截图

  • 相关阅读:
    第14周周总结
    第13周周总结
    栈与队列
    前端继承方式汇总
    实现前端资源增量式更新的一种思路
    link和@import引入外部样式的区别
    webSocket
    Java 下载JDK账号
    穿透
    vue.set方法的使用
  • 原文地址:https://www.cnblogs.com/78tian/p/8824151.html
Copyright © 2020-2023  润新知