博客作业03--栈和队列

Posted 王宵莹

tags:

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

1.学习总结

栈只能在同一端进行入栈出栈操作(FILO),而队列是在一端入队,在另一端出队(FIFO)。

查找了一些算法,灰色部分是目前还未接触过的算法

2.PTA实验作业

2.1.1 题目1:字符串是否对称

2.1.2 设计思路

    定义变量X,数组a[]存放数据;
    定义变量N=0,i控制循环,记录元素个数;
    定义栈S;
    
    输入字符串,并记录字符串的大小N;
    
    以N为栈的最大容纳量创建栈S;

    for i=0 to N
        字符串进入栈;
    end for

    for i=0 to a[i]!=\'\\0\'
        X=S出栈的数值;
        if a[i]与X不相等
            输出"no",并结束程序;
    end for

    输出 “yes”;

2.1.3 代码截图

2.1.4 PTA提交列表说明

一开始因为C/C++部分操作弄混了,修改后第二个测试点对了,但是第一个一直不对,以为是数组设置的不够大,但是在我增大到让程序运行超时时仍然不正确,也让其他同学替我看了,找不到到底错在哪,但题目给的样例能正确输出。

2.2.1 题目2:符号配对

2.2.2 设计思路

    定义栈S;
    定义自变量flag=1作为正误判断标志,i控制循环,len记录字符串长度;
    定义变量s[100000],X,e记录数据;
    
    初始化栈S;
    while(1)
    {
        输入字符串s;
        if s[0]为\'.\'并且s[1]为0   退出循环;

        len = 字符串s的长度;
        栈S的大小Size加上len;

        for i=0 to s[i]!=\'\\0\'
            if s[i]为\'/\' 或\'[\' 或\'{\'
                s[i]入栈;
            else if s[i]为\'/\'并且s[i+1]为\'*\' 且 i+1<len
                    令\'<\'进栈;   //用\'<\'代替\' /* \'

            else if s[i] == \')\'
                    if 栈不空
                        if S栈顶的元素为 \'(\'
                            出栈;
                    else if 栈空或不匹配
                        输出"NO""?-)"并退出程序;

            else if s[i] == \']\'
                    if 栈不空
                        if S栈顶的元素为 \'[\'
                            出栈;
                    else if 栈空或不匹配
                        输出"NO""?-]"并退出程序;

            else if s[i] == \'}\'
                    if 栈不空
                        if S栈顶的元素为 \'{\'
                            出栈;
                    else if 栈空或不匹配
                        输出"NO""?-}"并退出程序;

            else if s[i] == \'*\',s[i+1]==\'/\' 且 i+1<字符串长度
                    i++;
                    if 栈不空
                        if S栈顶的元素为 \'<\'
                            出栈;
                    else if 栈空或不匹配
                        输出"NO""?-*/"并退出程序;
        end for
    }

    if 栈内无右括号与之匹配
        输出"左括号-?";
    else 括号全部能匹配
        输出"YES";

2.2.3 代码截图

2.2.4 PTA提交列表说明

经过漫长的编写,测试后发现题目给的sample3输出结果不对,调试后找到了问题:我采取的是在一开始先录入所有的数据,直到收到\'.\'和\'\\n\',但是第三个样例中这样输入会导致后面的数据不能进入数组,造成结果错误,所以我改变了数据输入的方式,也的确对了,但是第六个测试点“左右符号个数相同,达到最大值,但不匹配”不明白是什么意思,也没办法找数据测试。

2.3.1 题目3:银行业务队列简单模拟

2.3.2 设计思路

    定义变量N记录总人数,n为顾客编号;
    定义变量i控制循环,na,nb为格子队列的元素数,e记录出队元素,数组a[1000]记录完成业务的顾客编号;
    定义并初始化队列QA,QB;
    输入N;
    if N>0
    {
        循环N次,按奇偶将顾客编号放入不同的队列中;

        i=0;flag=1;

        循环N次
            if flag==1且QA不为空
                QA连续两次出队列,并将编号记录在数组a中;
                if QB不为空 flag=0;
            else
                QB出队一次,记录出队的编号;
                if QA不为空 flag=1;

        for i=0 to N-1
            输出a[i]+" "
        end for
        输出a[i]
    }

2.3.3 代码截图

2.3.4 PTA提交列表说明

  • 第一次提交时只有第一个测试点(题目给的样例)正确,经过调试后对代码进行了修改
    修改前:

修改后:

  • 1.无论是na还是nb,当其为0时皆表示队列中没有元素存在,边界情况应该注意这一点;

  • 2.建立在上面那一点错误的情况下的错误。考虑到flag的初始值为1,而变为0是在flag==1的前提下,若是将QB出队的条件限制太多,反而不能够成功让QB队列中的元素出队。

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

3.1栈的PTA排名

3.2队列的PTA排名

总分:128分

4. 阅读代码

将十进制数转为任意进制的数

原地址:{https://blog.csdn.net/qianqin_2014/article/details/51031090}

该段代码可将输入的十进制数转化为自定义的进制数

优点:以前做进制转化可能还要考虑输出数的顺序、考虑放入数组的顺序,但是使用栈,直接将转化后的数逐个进栈再全部出栈,不必考虑顺序的问题。一个简单的代码体现了栈的特点。

5. 代码Git提交记录截图

emmm...下次应该一次提交一个代码的

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

博客作业03--栈和队列

博客作业03--栈和队列

博客作业03--栈和队列

博客作业03--栈和队列

博客作业03--栈和队列

博客作业03--栈和队列