第三章学习小结

(一)学习小结:栈和队列:栈和队列算是操作受限的线性表,它们的基本操作集是线性表操作集的子集

(1)栈:基本概念名称:栈顶(top)、栈底(base);插入和删除在栈的应用中称为入栈(Push)和出栈(Pop),入栈和出栈只在栈顶进行。根据存储结构,可分为顺序栈(顺序存储结构)和链栈(链式存储结构)。原则:后进先出

①顺序栈,基本操作有:栈的初始化、入栈、出栈和取栈顶元素。实现这些操作的算法如下:

#define MAXSIZE 100

typedef struct
{
 Selement *base;//栈底指针
 Selement *top;//栈顶指针
 int stacksize;//栈可使用的最大空间
}SqStack;
Status initStack (SqStack &S)//创建一个栈S,并置空
{
 S.base=new Selement [MAXSIZE];//为栈动态申请一个MAXSIZE大小的空间
 if(S.base==NULL)  return false;//内存空间分配失败,返回false
 S.top=S.base; //将栈置空
 S.stacksize=MAXSIZE;//将栈的空间长度置为MAXSIZE
}
Status Push(SqStack &S,Selement e)//入栈
{
 if(S.top-S.base==MAXSIZE) return false;//判断栈满,若栈满,返回false
 *S.top=e;//将栈顶元素置e
 ++*S.top; //修改栈顶指针
}
Status Pop(SqStack &S,Selement &e)//出栈
{
 if(S.top==S.base) return false;//判断栈空,若栈空,返回false
 --*S.top; //修改栈顶指针
 e=*S.top;//用e返回栈顶元素
}
Status GetPop(SqStack S)//取栈顶元素
{
 if(S.top!=S.base) return *(S.top-1);//栈非空。返回栈顶元素
}

入栈:①首先要判断是否栈满(S.top-S.base==MAXSIZE):栈满。②先将栈顶元素置为e,栈顶指针再加1

出栈:①判断是否栈空(S.top==S.base):栈空。②栈顶指针减1,用e存放栈顶元素值

②链栈:基本操作与顺序栈差不多,需要注意的是入栈不需要像顺序栈一样要判断是否栈满,只需要为新结点动态申请存储空间,但出栈是同样需要判断是否栈空

*栈应用的例子:(1)数制的转换。求余得到的数字放入栈的顺序与转换后的数制的高位到低位的顺序刚好相反,可以利用栈的后进先出原则。(2)括号匹配问题。基本思路:遍历字符串后,是左括号的话,入栈,遇到右括号是分两种情况:若栈空,匹配失败;栈非空时,若遇到匹配的右括号,左括号就出栈

(2)队列:①基本概念名称:队头(front)、队尾(rear)、入队和出队,队头出队,队尾入队;一样可以有顺序表示和链式表示,是先进先出原则。

①循环队列(队列的顺序表示):由于队头出队、队尾入队的限制,队列会出现假溢出现象,即可以使用的空间并没有使用完,但因为元素下标越界出现非法操作,因此采用循环队列。队空的条件:Q.front==Q.rear,队满的条件:(Q.rear+1)%MAXSIZE==Q.front(采取少用一个元素的空间的办法)

需要注意的是;在非空队列中,队头指针始终指向队头元素,而队尾元素始终指向队尾元素的下一个位置

入栈需要判断是否队满,出队要判断是否队空

②链队:同链栈一样,入队无需判断队满,只要为新结点申请存取空间;出队要判断队空

(2)课本上是算法,对于一些基本操作的实现还是需要去修改完成后才是程序,再者就是对于实在做不对的编程题应该及时需求帮助,或者是多去注释语句,帮助自己寻找错误。

(3)分享的资料:暂时无,因为在这一次学习过程中,除了看书,就是去寻求同学帮助

(4)对于顺序结构的实现和链式结构的实现还不够熟练,一部分是自己没有去对比两种存储结构的实现的算法,还有就是没有多打代码帮助理解。

(5)接下来的目标:继续巩固学习实现两种存储结构,去考虑用不同的方法实现同一个问题,帮助理解栈和队列,例如括号匹配问题等。