博客作业03--栈和队列

1.学习总结

1.1 写出你认为本周学习中比较重要的知识点关键词。

  • 重要的知识点关键词:数据结构、复杂度、抽象数据类型、线性表、栈和队列、串、算法、逻辑结构、存储结构、基本运算等;

1.2 使用思维导图将这些关键词组织起来。

1232047-20180414233827324-606361.png
1232047-20180414233930398-401215082.png

2.PTA实验作业

2.1 题目名称

题目1:7-2 符号配对(栈)

  • 请编写程序检查C语言源程序中下列符号是否配对:/* 与 */、( 与 )、[ 与 ]、{ 与 }

1. 设计思路(伪代码或流程图)

修改前:
1232047-20180413221545458-1639208704.png
修改后:
1232047-20180415233132485-1588449860.png

2.代码截图

1232047-20180413222213608-2126286419.png
1232047-20180413222428367-1610484758.png

3. PTA提交列表截图及说明

1232047-20180413222548350-1568691650.png

  • 答案错误。输出只有判断,没有输出相应缺少的符号,取栈顶函数出错,返回值应为 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. 设计思路(伪代码或流程图)

修改前:
1232047-20180413232219097-134642045.png
修改后:
1232047-20180415235934505-755305648.png

2.代码截图

1232047-20180413232652683-1391803714.png

3. PTA提交列表截图及说明

1232047-20180413232844037-929656319.png

  • 部分正确。m<n时出错,想法出错,没有进行环式循环,应从m的下一个人继续,修改函数代码;
  • 编译错误。编译C改成C++;

2.3 题目名称

题目3:7-2 银行业务队列简单模拟(队、列)

  • 设某银行有A、B两个业务窗口,且处理业务的速度不一样,其中A窗口处理速度是B窗口的2倍 ,请按业务完成的顺序输出顾客序列;

1. 设计思路(伪代码或流程图)

修改前:
1232047-20180413234945956-1988832092.png
修改后:
1232047-20180415234907104-806523355.png

2.代码截图

1232047-20180413235103822-1809890069.png
1232047-20180413235142319-1014685608.png

3. PTA提交列表截图及说明

1232047-20180413235326697-1287221480.png
1232047-20180413235300237-656240669.png

  • 格式错误。最后有多余空格;
  • 部分正确。最大、最小N格式错误,输入1 5时,前面出现空格,加入flag进行判断输出,当flag=0时无空格,否则加空格,解决;

3.截图本周题目集的PTA最后排名

3.1 栈PTA排名

1232047-20180414000143914-302556054.png
1232047-20180414000053087-708949247.png

3.2 队列PTA排名

1232047-20180414000258642-1587073689.png
1232047-20180414000336134-672296009.png

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提交记录截图

1232047-20180414011550776-687260150.png

转载于:https://www.cnblogs.com/78tian/p/8824151.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值