这个作业属于哪个班级 | 数据结构--网络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 分析该题目解题优势及难点。
优势是该题解的时间复杂度和空间复杂度都很低,效率高,且不占空间,难点是在对于两个栈的判断和插入删除操作的代码实现