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 分析该题目解题优势及难点。

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

posted @ 2021-04-05 22:09  i566  阅读(122)  评论(1编辑  收藏  举报