Q:栈的定义和实质
A:栈是一种特殊的数据结构,存入其中的数据先进后出,即最后存入的数据在读取时会被第一个读取;栈的实质是只能在表尾进行插入和删除的线性表,也就是说,栈本身就是一个线性表,只是操作方式较为特殊。
Q:栈的组成和相关操作
A:栈中允许插入和删除的一端称为栈顶(top),另外一端称为栈底,不含任何元素的栈称为空栈。栈简称”LIFO”结构,栈作为特殊的线性表,具有线性表的特性,用于插入和删除的表尾就是指栈顶(top),栈的插入称为压栈,进栈或者入栈(push);删除称为出栈,弹栈(pop)。
Q:栈的接口
A:ADT 栈 (stack)
Data
Qperation
InitStack(*S);建立空栈
DestroyStack(*S);判断是否存在栈
ClearStack(*S);清空栈
StackEmpty(S);判断栈是否为空
Gettop(S,*e);栈顶元素值
Push(*s,e);压栈
Pop(*S,*e);出栈
StackLength(S);求栈长
endADT
Q:栈的顺序储存结构及其实现
A:栈底为下标为0的一端,所以top为-1时栈为空栈;栈的结构定义:
typedef int SElemtype;根据需求定义Selemtype变量类型
Typedef struct
{
SElemtype data[MAXSIZE];
Int top;用于指针指向栈顶
}Sqstack;
Q:如何实现进栈操作?
A:进栈操作即将数据压入栈顶,代码如下:
Status Push(SqStack *S,SElemtype e)
{
If(S->top == MAXSIZE -1)
{
Return ERROR;判断是否栈满
}
S->top++;栈顶指针加一
S->data[s->top] = e;将新元素压入栈顶
return OK;
}
Q:如何实现出栈?
A:出栈即将栈顶数据赋给指定变量,删除栈顶元素,代码如下:
Status Pop(SqStack *S,SElemtype e)
{
If(S->top == -1)
{
Return ERROR;判断是否空栈;
}
*e = S->data[s->top];将栈顶元素赋给e
S->top--;栈顶指针减一
return OK;
}
Q:两栈共享空间如何实现?
A:我所理解两栈共享空间就是将栈中间剖开,在n-1和n之间挖一个洞,将原有的两端分别作为两个栈的栈底,而n和n-1作为新的栈顶,但由于两者剖开并没有断开,所以两者的空间可以共享。
Q:两栈共享空间的进栈和出栈怎么实现?
A:两站共享空间由于是剖开的只是中间断开,实质上容量没有增加,当两栈元素都满了之后,两栈栈顶为同一段空间时,说明栈满,此时压不进新元素,从另一个角度讲,只要两栈栈顶没有变为同一段空间,那就可以继续压入数据;出栈时,当两栈都为空即说明栈溢出,栈底兜不住了,再出就挖出界了。
Q:栈的链式储存结构怎么实现?
A:链式结构中,栈顶放在单链表的头部,空栈时就是栈顶指向NULL的时候,链栈不存在栈满的情况。