常州工学院数据结构 第三章 栈和队列 答案

3.1 简答题(不用抄题目)

1. 栈的两种存储结构是什么?

顺序存储和链式存储。由于入栈和出栈时没有元素移动,所以大多数情况用顺序存储。

  1. 判定一个顺序栈ST(最多元素为m0)为空的条件是什么?

栈空的条件:ST->top==-1  

  1. 定一个顺序栈ST(最多元素为m0)为栈满的条件是什么?

栈满的条件ST->top==m0-1

  1. 栈的特点是什么?队列的特点是为什么?

栈的特点是后进先出(LIFO),队列的特点是先进先出(FIFO)

  1.  带头结点的链栈S中,将一个指针s所指结点(e)进栈,执行的语句是什么?

s->next=S->next; //插入s结点作为第一个结点

S->next=s;

  1.  带头结点的链栈S中,出栈一个元素给x,执行的语句是什么?

if (S->next==NULL) //栈空的情况

     return false;

    …

    p=S->next;

    x=p->data;

S->next=p->next; //删除p结点

    free(p);

  1. 栈和队列的共同点是什么?

都是特殊的线性表,插入和删除都在线性表的开头或结尾进行。

  1.  判定一个循环队列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. 简述下列算法的功能

  1. 先把栈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;
}

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值