数据结构C语言版,栈与队列习题与答案

第三章:

  1. 相比较普通线性表,栈的区别是什么?栈的元素的进出原则是什么?请简单解释下列术语:栈顶、栈顶元素、栈底、进栈、出栈。 

栈是限定仅可在表尾进行插入与删除操作的操作受限的线性表

进出原则:先进后出,后进先出

栈顶:表尾端

栈底:表头端

栈顶元素:表尾端元素

进栈:表尾端插入元素

出栈:表尾端删除元素,删除栈顶元素

2、 顺序栈的定义: typedet struct {  

ElemType *base; //动态分配方案,指针 base 指向栈元素空间的及地址;  

int top; //栈顶指针,实际是记录栈顶元素下一单元的下标,简称为栈顶指针; int stacksize; //栈空间的最大长度  

}SqStack; SqStack s; //s 为顺序栈的变量  

请根据上述定义,给出元素 e 进栈(注意判断栈是否已满)程序段,给出出栈的程序段

注意判断是否为空栈 

//将元素e入栈

Status Push(SqStack& S, SElemType e)//传入栈的地址和元素e

{

if (S.top - S.base >= S.stacksize)

{

//S.base = (SElemType*)realloc(S.base,(S.stacksize + STACKINCREMENT) * sizeof(SElemType));//如果栈满,追加存储空间

}

if (!S.base)

{

exit(OVERFLOW);//存储分配失败返回错误值

}

*S.top = e;//e赋值给当前栈顶

S.top++;//栈顶指针+1

return 0;

3、 链栈的定义如下: 

 struct node {  

ElemType data; //栈元素  

Struct node *next; //指下一个结点

 } *top=NULL; //链栈没有头结点,用指针 top 指向栈顶结点,top 为空时为空栈初始化链栈为空栈  

根据上述定义,请给出元素 e 进栈的程序段,给出出栈的程序段(注意判断栈空) 

//将元素e入栈

Status Push(LinkStack& S, SElemType e)

{

SNode* P;//生成一个SNode形的指针

P = (LinkStack)malloc( sizeof(SNode));//这个指针指向一个新的SNode类新的结点

P->data = e;//这个结点的数据域上的指针指向传进来的元素e

P->next = S;//新结点插向栈顶,这里新节点的P指针的地址域指向了栈顶S指针

S = P;//S这个头指针重新指向栈顶

//注意,链栈的指针是一直指向栈顶的,通过从栈顶指向下一个来实现栈的先进后出!!!

return OK;

}

  1. 给出求下述表达式值的过程:#8+5-3*6+(7-1)/2#

操入左,运入右
栈空直接入,不空看优先
大于则出栈,否则都入栈
左括直接入,遇右吐出来

  1. 相比较普通线性表,队列的区别是什么?队列的元素的进出原则是什么?请简单解释下列术语:队首元素、队尾元素、入队、出队。 

区别:队列是仅限一端插入另一端删除得操作受限得线性表

原则,先进先出,后进后出

队首元素:表头元素

队尾元素:表尾元素

入队:从表尾插入新的元素

出队:删除表头元素

  1. 在链式存储的队列中插入一个新元素,描述算法思路 

新建一个结点,插入尾指针指针域,尾指针移动到新的结点得指针域

  1. 在链式存储的队列中删除一个元素,描述算法思路 

新建一个P指针指向队头指针指针域,队头指针后移一位,释放P指针

  1. 如何解决队列顺序存储结构出现的假溢出问题,给出具体解决方案。 

臆设一个环状空间

  1. 在循环队列中,当用 front 记录队首元素,rear 记录队尾元素下一个空间,当front=rear 时,循环队列可能为空,也可能是已满,怎么进行区分,给出解决方案,并给出不同解决方案中,判断队空和队满的条件。

方案1:设置一个标志区分 满为rear==标志;空为front==rear

方案2:少用一个元素空间,队满:(rear+1)%MAXQSIZE==front;队空:front==rear

  1. 给出循环队列元素入队的算法思路 
  1. 判断队列是否满
  2. 新元素入队尾
  3. 队尾指针+1
  1. 给出循环队列元素出队的算法思路。 
  1. 判空
  2. 对头元素删除
  3. 头指针-1
  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值