3.1 简答题(不用抄题目)
1. 栈的两种存储结构是什么?
顺序存储和链式存储。由于入栈和出栈时没有元素移动,所以大多数情况用顺序存储。
- 判定一个顺序栈ST(最多元素为m0)为空的条件是什么?
栈空的条件:ST->top==-1
- 判定一个顺序栈ST(最多元素为m0)为栈满的条件是什么?
栈满的条件ST->top==m0-1
- 栈的特点是什么?队列的特点是为什么?
栈的特点是后进先出(LIFO),队列的特点是先进先出(FIFO)
- 带头结点的链栈S中,将一个指针s所指结点(e)进栈,执行的语句是什么?
s->next=S->next; //插入s结点作为第一个结点
S->next=s;
- 带头结点的链栈S中,出栈一个元素给x,执行的语句是什么?
if (S->next==NULL) //栈空的情况
return false;
…
p=S->next;
x=p->data;
S->next=p->next; //删除p结点
free(p);
- 栈和队列的共同点是什么?
都是特殊的线性表,插入和删除都在线性表的开头或结尾进行。
- 判定一个循环队列QU(最多元素为m0)为空的条件是什么?
循环队列QU空的条件:QU.front==QU.rear
9.判定一个循环队列QU(最多元素为m0,少用一个元素空间)为满队列的条件是什么?
循环队列QU满的条件:(QU.rear+1)%m0==QU.front
10.循环队列用数组A[0,m-1]存放其元素值,已知其头尾指针分别是front和rear,则求当前队列中的元素个数的语句是什么?
(rear-front+m)%m
3.2 算法分析题(不用抄题目)
1.
(1)每一个栈建立一个顺序存储空间。优点是简单,代码容易实现,缺点是各个栈的数组的大小不好确定。给大了,浪费空间,给小了,容易溢出。
(2)多个栈共享一个顺序存储空间,使得顺序空间充分得到利用,减少了溢出的可能性,但不能完全避免溢出。另外代码实现也比较复杂(各个栈的出入栈代码、判断各个栈的栈空和栈满条件变得很复杂)。
(3) 每一个栈建立一个链栈,由于动态分配空间,不会出现溢出现象,空间利用率也很充分。由于指针也需要空间,存储密降低。另外链表存储实现代码比顺序存储复杂,在不追求空间利用率的情况下,还是不要用链栈,用多个栈共享空间好一些。
2. 简述下列算法的功能
- 先把栈st中元素一个一个出栈,同时把不等于x的元素放入临时栈tmps中,然后临时栈tmps中元素再一个一个出栈放入栈st中。所以算法的功能是删除栈st中值等于x的元素。
3.3 算法设计题(不用抄题目,先写出算法思想再写出关键代码)
1. 把线性链表逆置。(要求不修改链表指针,把线性链表中的元素入栈后再出栈放回原来线性链表中,要求写出关键代码(链表定义和栈定义和一个函数)。出入栈基本操作代码可以省略不写。
思想:先把链表中每一个结点的数据域放入栈中,然后把栈中元素一个一个出栈再放到原来链表的数据域中,达到线性链表逆置的功能。
//线性链表的定义省略,见书
//顺序栈的定义省略,见书
void Reverse_L(LinkList &L)
{
LNode *p;
SqStack S;
InitStack(S);
p = L->next; //p指向第一个结点
while (p) //遍历链表,各结点入栈
{ Push(S,p->data);
p=p->next;
}
p = L->next; //p指向第一个结点
while(!StackEmpty(S)) //从栈中依次中取出结点放入链表
{
Pop(S,p->data) //出栈
p=p->next;
}
}
2.修改课本上例题3.5(括号匹配),加上大括号和中括号。
bool Match(char exp[],int n)
{ int i=0; char e;
bool match=true;
LinkStNode *st;
InitStack(st); //初始化栈
while (i<n && match) //扫描exp中所有字符
{
if (exp[i]=='('|| exp[i]=='['|| exp[i]=='{')
Push(st,exp[i]);
else if (exp[i]==')'|| exp[i]==']'|| exp[i]=='}') //当前字符为右括号
{
if (GetTop(st,e)==true)
{
if (e!='(' && exp[i]==')'|| e!='[' && exp[i]==']' ||e!='{' && exp[i]=='}') //栈顶元素不为'('或'['或'{'时不匹配
match=false;
else
Pop(st,e); //将栈顶元素出栈
}
else match=false; //无法取栈顶元素时不匹配
}
i++; //继续处理其他字符
}
if (!StackEmpty(st))
match=false;
DestroyStack(st); //销毁栈
return match;
}