• DS博客作业02--栈和队列


    这个作业属于哪个班级 数据结构--网络2011/2012
    这个作业的地址 DS博客作业02--栈和队列
    这个作业的目标 学习栈和队列的结构设计及运算操作
    姓名 骆念念

    0.PTA得分截图

    栈和队列题目集总得分,请截图,截图中必须有自己名字。题目至少完成2/3(不包括选择题),否则本次作业最高分5分。

    1.本周学习总结(0-5分)

    1.1 栈

    画一个栈的图形,介绍如下内容。

    首先栈的最大特点是先进后出和时进时出,栈顶先出,栈底最后出,栈的关系是线性关系。只允许在栈顶进行插入和删除。栈的删除并没有真正意义上的删除,只是通过top指针的移动,改变栈顶元素,从而到底删除的目的。如果栈是顺序存储结构,对于取栈时,要对栈进行是否为空的判断,进栈时,对栈进行是否为满的判断。链式栈不需要考虑是否为满,只要考虑是否为空即可
    顺序栈的四要素

      栈空条件:top=-1
      栈满条件:top=MaxSize-1
      进栈e的操作:top++;st->data[top]=e;
      退栈操作:e=st->data[top];top--;
    

    链式栈的四要素

      栈空条件:s->next=NULL;
      栈满条件:不考虑
      进栈e操作:结点插入到头结点之后,链表头插法
      退栈操作:取出头结点之后的节点的元素并删除
    

    顺序栈的结构、操作函数

    栈的操作函数

    void InitStack(SqStack &s)//栈的初始化
    {
        s=new Stack;
        s->top=-1;
    }
    void DestroyStack(SqStack &s)//栈的销毁
    {
       delete s;
    }
    bool StackEmpty(SqStack s)//判断栈是否为空
    {
       return (s->top==-1);
    }
    bool push(SqStack &s,ElemType e)//进栈
    {
       if(s->top==MaxSie-1)
       return false;
       s->top++;
       s->data[s->top]=e;
       return true;
    }
    bool pop(SqStack &s,ElemType &e)//出栈
    {
       if(s->top==-1)
       return false;
       e=s->data[s->top];
       s->top--;
       retrun true;
    }
    bool GetTop(SqStack &s,ElemType &e)//取栈顶元素
    {
       if(s->top==-1)
       retrun false;
       e=s->data[s->top];
       return true;
    }
    

    链栈的结构、操作函数

    typedef struct linknode//链式栈结构体定义
    {
       ElemType data;
       struct linknode *next;
    }LiNode,*LiStack;
    void InitStack(LiStack &s)//初始化
    {
       s=new LiNode;
       s-<next=NULL;
    }
    void DestroyStack(LiStack &s)//销毁栈
    {
       LiStack node;
       while(s!=NULL)
       {
         node=s;
         s=s->next;
         delete node;
       }
    }
    void StackElempty(LiStack s)//栈空
    {
       return(s->next==NULL);
    }
    void Push(LiStack &s)//进栈
    {
       LiStack p;
       p=new LiNode;
       p->data=e;
       p->next=s->next;
       s->next=p;
    }
    bool pop(LIStack&s,ElemType &e)//出栈
    {
       LiStack p;
       if(s->next==NULL)
       return false;
       p=s->next;
       e=p->data;
       s->next=p->next;
       delete p;
       return true;
    }
    bool GetTop(LiStack s,ElemType &e)//取栈顶
    {
       if(s->next==NULL)
       return false;
       e=s->next->data;
       return true;
    }
    

    1.2 栈的应用

    表达式

    1.3 队列

    画一个队列的图形,介绍如下内容。

    队列就和日常生活中的排队一样,先进先出,这点是和栈的区别。对队列同样可以进行插入删除操作,删除没有真正删除。队列中的rear指向队尾元素,front指向对头元素的前一个位置。在进行入队操作时,先判断是否为队满,并只需要移动rear即可,在进行出队操作时,先判断对是否为空,只需移动front即可。
    顺序队的四要素

    对空条件:front=rear
    队满条件:rear=MaxSize-1
    元素e进队:rear++;data[rear]=e;
    元素e出队:front++;e=data[front]
    

    链队的四要素

    对空条件:front=rear=NULL;
    队满条件:不考虑
    进队操作:将包含e的节点插入到单链表表尾
    出队操作:删除单链表首数据节点
    

    顺序队列的结构、操作函数

    typedef struct
    {
       ElemType data[MaxSize]
       int front,rear;
    }Queue,*SqQueue;
    void InitQueue(SqQueue &q)
    {
       q=new Queue;
       q->front=q->rear=-1;
    }
    void DestroyQueue(SqQueue &q)
    {
       delete q;
    }
    bool QueueEmpty(SqQueue q)
    {
       return (q->front==q->rear);
    }
    bool enQueue(SqQueue &q,ElemType e)
    {
       if(q->rear+1==MaxSize)
       return false;
       q->rear=q->rear+1;
       q->data[q->rear]=e;
       return true;
    }
    bool deQueue(SqQueue &q,ElemType &e)
    {
       if(q->front==q->rear)
       return false;
       q->front=q->front+1;
       e=q->data[q->front];
       return true;
    }
    

    环形队列的结构、操作函数

    rear=(rear+1)%MaxSize
    data[rear]=e;//入队操作
    front=(front+1)%MaxSize
    data[front]=e;//出队操作
    front=rear=0;//初始化队列
    (rear+1)%MaxSize=front;//堆满条件
    front=rear;//对空条件
    

    链队列的结构、操作函数

    typedef struct qnode
    {
       ElemType data;
       struct qnode *next;
    }QNode,*LiQueue;
    typedef struct 
    {
       QNode *front;
       QNode *rear;
    }LinkQueue;
    Status InitQueue(LinkQueue &Q)
    {
       Q.front=Q.rear=new QNode;
       if(!Q.front) exit (OVERFLOW);
       Q.front->next=NULL;
       return OK;
    }
    Status QueueEmpty(LinkQueue Q)
    {
       return (Q.front==Q.rear);
    }
    Status GetHead(LinkQueue Q,QElemType &e)
    {
       if(Q.front==Q.rear)
       return ERROR;
       e=Q.front->next->data;
       return OK;
    }
    Status EnQueue(LinkQueue &Q,QElemType e)
    {
       p=new QNode;
       if(!p) ext(OVERFLOW)
       p->data=e;
       p->next=NULL;
       q.rear->next=p;
       Q.rear=p;
       return OK;
    }
    Status DeQueue(LinkQueue &Q,QElemType &e)
    {
       if(Q.front==Q.rear)return ERROR;
       p=Q.front->next=p->next;
       if(Q.rear==p)
       Q.rear=Q.front;
       delete p;
       return OK;
    }
    
    

    队列应用,要有具体代码操作。
    =舞伴问题=

    2.PTA实验作业(4分)

    此处请放置下面2题代码所在码云地址(markdown插入代码所在的链接)。如何上传VS代码到码云

    2.1 符号配对

    2.1.1 解题思路及伪代码

    解题思路:1.输入一串字符串,计算字符串长度
    2.在循环内,对每个字符进行判断,如果字符为{【(,就入队,如果字符为},】),将出队后的对头元素与该字符进行左右的配对,配对成功,则出队。
    3.如果对空,且循环条件i==len,输出yes,表明将整个字符串都遍历完,且配对成功,如果对空,就输出no,并取对头元素。

      输入str
      len=strlen(str)
      for i=0 to i=len-1
        if 字符不是{【()】}
         continue
      if 字符为[{(
       push
      if 字符}】)
    then 与对头元素配对
      判断对空
    

    2.1.2 总结解题所用的知识

    用了c++模板中的stack

    2.2 银行业务队列简单模拟

    2.2.1 解题思路及伪代码

    定义int n,队列q,数组a
    输入n
    判断奇偶
    是奇输出
    各两个奇输出一个偶。。。
    

    2.2.2 总结解题所用的知识点

    c++模板中的queue的灵活运用

    3.阅读代码(0--1分)

    找1份优秀代码,理解代码功能,并讲出你所选代码优点及可以学习地方。主要找以下类型代码:

    考研题
    ACM题解
    leecode--栈
    leecode--队列
    注意:不能选教师布置在PTA的题目。完成内容如下。

    3.1 题目及解题代码

    可截图,或复制代码,需要用代码符号渲染。

    3.2 该题的设计思路及伪代码

    链表题目,请用图形方式展示解决方法。同时分析该题的算法时间复杂度和空间复杂度。

    定义为整型两个栈
    当栈1不为空时,出栈
    如果栈2为空,则将栈1里的左右元素都弹到栈2里面
    如果栈2扔为空,则返回-1,否则从栈2弹出一个元素并返回
    

    时间复杂度:O(1)
    空间复杂度:O(n)

    3.3 分析该题目解题优势及难点。

    优势是该题解的时间复杂度和空间复杂度都很低,效率高,且不占空间,难点是在对于两个栈的判断和插入删除操作的代码实现

  • 相关阅读:
    Entity Framework 4 in Action读书笔记——第七章:持久化对象到数据库:使用SaveChanges持久化实体
    ASP.NET MVC+Colorbox做的一个Demo(一)
    Entity Framework 4 in Action读书笔记——第七章:持久化对象到数据库:持久化的一些技巧
    NHibernate初学者指南(4):定义数据库架构
    Entity Framework 4 in Action读书笔记——第六章:理解实体的生命周期(三)
    NHibernate初学者指南(1):开篇
    Entity Framework 4 in Action读书笔记——第七章:持久化对象到数据库:持久化修改的实体到数据库
    Java面试题每日五题(2010/02/26)
    Notes for Hadoop the definitive guide
    简明Java笔记
  • 原文地址:https://www.cnblogs.com/luoniannian/p/14602183.html
Copyright © 2020-2023  润新知