第三章小结

一、第三章主要学习了栈和队列的定义和特点以及各自实现的基本操作,套路基本与第二章相同。步骤一般为定义栈(队列),然后写初始化栈(队列),出栈(队),入栈(队)函数。

二、栈
概念:只能在一端进行插入和删除的线性表,先进后出

(1) 顺序栈
使用顺序表实现,创建时必须声明栈的size
把n端作为栈顶,pop和push的时间代价为O(1)
空栈的top = -1
(2)链式栈
使用链表实现时不需要头结点
pop和push的时间代价为O(1)

其中对于链栈我们要注意的是:链栈则没有上溢的限制,它就象是一条一头固定的链子,可以在活动的一头自由地增加链环(结点)而不会溢出,链栈不需要在头部附加头结点,因为栈都是在头部进行操作的,如果加了头结点,等于要在头结点之后的结点进行操作,反而使算法更复杂,所以只要有链表的头指针就可以了。

三、队列
概念:一种只能从队尾插入(enqueue),以及从队首删除(dequeue)的线性表。先进先出(FIFO)。

(1) 顺序队列

元素一一对应,存储空间预分配,可能会空间闲置或队满溢出,数据元素个数不能自由扩充。

(2) 链式队列

链表实现,不需要头结点

三、作业遇到的问题:

其实作业的基本思路在书上已经清晰明了了,括号匹配问题,借助栈,每一次读取,将左括号压栈,等待匹配的同类右括号;每当读入一个右括号,若与当前 栈顶的左括号类型相同,则两者匹配,将栈顶的左括号出栈,直到表达式扫描完毕。

做这一题的时候,其实我的思路已经明了了,所以没出现什么错误,除了几次粗心的编译错误。

实践题的基本思路:首先将输入的数据元素按照奇偶性分别压入两个不同的队列,然后判断压入偶数的队列是否为空,不为空则队头元素转移到另一新队列中,循环执行两次。压入奇数的队列则循环一次

for(int i=0; i<n; i++{

int a,b;
for(int i=0; i<2; i++)
{
if(A.front!=A.rear)//判断A队列是否为空,不为空则队头元素转移到Z队列中,循环执行两次
{
DeQueue(A,a);
EnQueue(Z,a);
}
}


if(B.front!=B.rear)//判断B队列是否为空,不为空则队头元素出队到Z队列中,执行一次 
{
DeQueue(B,b);
EnQueue(Z,b);
}

}




 

posted @ 2019-03-31 16:21  ZZHHH  阅读(186)  评论(2)    收藏  举报