3.1 简答题(不用抄题目)
1. 栈的两种存储结构是什么?
栈的存储结构
和线性表类似,栈也有两种基本的存储结构:顺序存储结构和链式存储结构。
顺序栈:
顺序栈是使用顺序存储结构实现的栈,即利用一组地址连续的存储单元依次存放栈中的数据元素。
由于栈是一种特殊的线性表,因此在线性表的顺序存储结构的基础上,选择线性表的一端作为栈顶即可。
根据数组操作的特性,选择数组下标大的一端,即线性表顺序存储的表尾来作为栈顶,此时入栈、出栈等操作可以在Ο(1)时间完成。
由于栈的操作都在栈顶完成,因此在顺序栈的实现中需要附设一个指针 top 来动态的指示栈顶元素在数组中的位置。
通常 top 可以用栈顶元素所在数组下标来表示,top= -1 时表示空栈。
链栈:
链栈即采用链表作为存储结构实现的栈。
当采用单链表存储线性表后,根据单链表的操作特性选择单链表的头部作为栈顶,此时,入栈、出栈等操作可以在Ο(1)内完成。
由于栈的操作只在线性表的一端进行,在这里使用带头结点的单链表或不带头结点的单链表都可以。
使用带头结点的单链表时,结点的插入和删除都在头结点之后进行;使用不带头结点的单链表时,结点的插入和删除都在链表的首结点上进行。
2.判定一个顺序栈ST(最多元素为m0)为空的条件是什么?
ST -> top == -1
3.判定一个顺序栈ST(最多元素为m0)为栈满的条件是什么?
ST -> top= =m0-1
4.栈的特点是什么?队列的特点是为什么?
1.在栈中,栈的修改按照 先进后出 的原则进行。
2.栈底指针始终指向栈底,栈顶指针始终指向最上面的那个元素。
1.队列是一种 先进先出 的线性表。允许在表的一端进行插入,而在另一端进行删除元素。
2.在队列中,允许插入的一端称为队尾,允许输出的一段称为队首。队首元素始终指向最前面的元素,队尾元素始终指向最后到来的元素。
5.带头结点的链栈S中,将一个指针s所指结点(e)进栈,执行的语句是什么?
链栈的进栈操作:
Status Push (LinkStack *S, SElemType e)
{
LinkStackPtr s = (LinkStackPtr) malloc (sizeof(StackNode));
s->data = e;
s->next = s->top; //把当前的栈顶元素赋值给新结点的直接后继
S->top = s; //将新的结点s赋值给栈顶指针
S->count++;
return OK;
}
6.带头结点的链栈S中,出栈一个元素给x,执行的语句是什么?
链栈的出栈结构:
Status Pop (LinkStack *S, SElemType *e)
{
LinkStackPtr x;
if (StackEmpty( *S ))
return ERROR;
*e = S->top->data;
x = S->top; //将栈顶结点赋值给x
S->top = S->top->next; //使栈顶指针下移一位,指向后一结点
free(x); //释放结点x
S->count--;
return OK;
}
7.栈和队列的共同点是什么?
1.栈和队列的共同处是:它们都是由几个数据特性相同的元素组成的有限序列,也就是线性表。
2.只允许在端点处插入和删除元素。
8.判定一个循环队列QU(最多元素为m0)为空的条件是什么?
QU->front == QU->rear
9.判定一个循环队列QU(最多元素为m0,少用一个元素空间)为满队列的条件是什么?
QU->front == (QU->rear+1)%m0
10. 循环队列用数组A[0,m-1]存放其元素值,已知其头尾指针分别是front和rear,则求当前队列中的元素个数的语句是什么?
等效于问:假设以数组 A[m]存放循环队列的元素
(rear-front+m)%m
3.2 算法分析题(不用抄题目)
- 优点:每个栈仅用一个顺序存储空间时,操作简单。
缺点:若分配空间小,容易产生溢出;若分配空间大,容易造成浪费,各栈不能共享空间。
- 优点:多个栈仅用一个顺序存储空间,能够充分利用存储空间,只在整个存储空间都用完时才会产生溢出(不容易产生溢出)。
缺点:当一个栈满时要向左、右查询有无空闲单元。如果有,则要移动元素和修改相关的栈底和栈项指针。当接近栈满时,要查询空闲单元、移动元素以及修改栈底、栈顶指针,此过程计算复杂且耗时。
- 优点:多个链栈一般不用考虑栈的溢出。
缺点:栈中元素用指针相连接,比顺序存储多占用存储空间。
2. 简述下列算法的功能
删除栈中值为 x 的元素。