第03次作业-栈和队列

Posted 木桐

tags:

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

1.学习总结

到现在为止,已经学习了数据结构绪论、线性表、栈和队列等知识点。尝试使用思维导图将这些碎片化的概念、知识点组织起来。使用Xmind画出知识点及知识点之间的联系。步骤如下:
1.1 写出你认为本周学习中比较重要的知识点关键词,如逻辑结构、栈、队列、存储结构等。
1.2 使用思维导图将这些关键词组织起来。

2.PTA实验作业

1、题目1:7-1 jmu-字符串是否对称

编写一个算法利用顺序栈判断一个字符串是否是对称串。所谓对称串是指从左向右读和从右向左读的序列相同。

2.设计思路:

bool symmetry(ElementType str[])

{

  定义栈指针st ElementType变量e

  for i=0 to str[i]=\'\\0\'

    str[i]进栈

  end for

  for i=0 to str[i]=\'\\0\'

  {

    出栈

    if 正逆序不相等

      return false;

  }

  销毁栈。

  return true;

}

3.代码截图(主要函数)

4.PTA提交列表说明

错误原因:str数组可能和data数组大小不统一。

解决方法:将其大小改成MaxSize。

1、题目2:7-2 符号配对

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

2.设计思路:

    定义变量flag=1,i
    定义字符变量e和str数组 
    while(输入每一行字符)
    {
        if(str[0]为\'.\'且str[1]为\'\\n\')
            break; 
        for i=0 to str[i]=\'\\0\'
        {
            if str[i]为\'(\' 或者 str[i]为\'[\' 或者 str[i]为\'{\'
                str[i]入栈 
            if str[i]为\'/\'且str[i+1]为\'*\'
            {
                将两个都入栈并且i+2 
            }
            if str[i]为\')\'
            {
                if 栈不为空且s->next->data为\'(\'
                    出栈 
                else
                {
                    将str[i]赋值给c 
                    flag=0;
                    break;
                }
            }
            if str[i]为\']\'
            {
                if 栈不为空且s->next->data==\'[\'
                    出栈
                else
                {
                    将str[i]赋值给c 
                    flag=0;
                    break;
                }
            }
            if str[i]为\'}\'
            {
                if 栈不为空且s->next->data==\'{\'
                    出栈
                else
                {
                    将str[i]赋值给c 
                    flag=0;
                    break;
                }
            }
            if str[i]为\'*\'且str[i+1]为\'/\'
            {
                if 栈不为空且s->next->data==\'*\'
                {
                    出栈 
                    if 栈不为空且s->next->data==\'/\'
                        出栈 
                    else
                    {
                        将str[i]赋值给c
                        flag=0;
                        break;
                    }
                }
                else
                {
                    将str[i]赋值给c
                    flag=0;
                    break;
                }
            }
        }
    }
    if flag==1且栈不为空
        return true;
    else
        return false;
}

3.代码截图(主要函数)

4.PTA提交列表说明

错误原因:括号匹配成功的条件判断错误。写代码的时候写成两个*所以错了

解决方法:将其条件由栈不为空改为当栈为空时return true。将第二个*改成/就对了。

1、题目3:7-1 jmu-报数游戏

 报数游戏是这样的:有n个人围成一圈,按顺序从1到n编好号。从第一个人开始报数,报到m(m<n)的人退出圈子;下一个人从1开始报数,报到m的人退出圈子。如此下去,直到留下最后一个人。其中n是初始人数;m是游戏规定的退出位次(保证为小于n的正整数)。要求用队列结构完成。输出数字间以空格分隔,但结尾不能有多余空格。

2.设计思路:

void baoshu(SqQueue *Q,int m)
{
    定义变量cnt计数
    定义ElemType e
    while(队列不为空)
    {
        for cnt=1 to m
        {
            出队
            入队 
        }
        出队且输出e 
        if(队列不为空)
        {
            cout<<" ";
        }
    }
}

3.代码截图(主要函数)

4.PTA提交列表说明

 

 

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

本次2个题目集总分:125+215=340分
必做题共:205分

3.1 栈PTA排名

 

 

3.2 队列PTA排名

 

 

3.3 我的总分:205

得分:2

4. 阅读代码

 代码功能:堆栈模拟队列

 优点:代码简洁,思路清晰。

#include <iostream>  
#include <stack>  
#include <string>  
using namespace std;  
  
stack<int> staIn, staOut;  
  
int main()  
{  
    int n1, n2;  
    cin>>n1>>n2;  
    if(n1 > n2)  
        n1 = n2;  
    string s;  
      
    while(cin>>s, s != "T")  
    {  
        if(s == "A")  
        {  
            int t;  
            cin>>t;  
  
            if(staIn.size() == n1)  
            {  
                if(staOut.size() > 0)  
                {  
                    cout<<"ERROR:Full"<<endl;  
                    continue;  
                }  
                int i;  
                for(i = 0; i < n1; ++i)  
                {  
                    staOut.push(staIn.top());  
                    staIn.pop();  
                }  
            }  
  
            if(staIn.size() < n1)  
                staIn.push(t);  
            else  
            {  
                cout<<"ERROR:Full"<<endl;  
                continue;  
            }  
        }  
        else if(s == "D")  
        {  
            if(staOut.size() == 0)  
            {  
                if(staIn.size() == 0)  
                {  
                    cout<<"ERROR:Empty"<<endl;  
                    continue;  
                }  
                int i, size = staIn.size();  
                for(i = 0; i < size; ++i)  
                {  
                    staOut.push(staIn.top());  
                    staIn.pop();  
                }  
            }  
            cout<<staOut.top()<<endl;  
            staOut.pop();  
        }  
    }  
    return 0;  
} 

代码地址:https://blog.csdn.net/a418382926/article/details/21635879

5. 代码Git提交记录截图

 

 

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

第03次作业-栈和队列

第03次作业-栈和队列

第03次作业-栈和队列

第03次作业-栈和队列

第03次作业-栈和队列

第03次作业-栈和队列