//给出栈的两种存储结构形式名称,在这两种栈的存储结构中如何判别栈空与栈满?
(1)顺序栈(top用来存放栈顶元素的下标)
判断栈S空:如果S->top==-1表示栈空。
判断栈S满:如果S->top==Stack_Size-1表示栈满。
(2) 链栈(top为栈顶指针,指向当前栈顶元素前面的头结点)
判断栈空:如果top->next==NULL表示栈空。
判断栈满:当系统没有可用空间时,申请不到空间存放要进栈的元素,此时栈满
//假设以带头结点的循环链表表示队列,并且只设一个指针指向队尾元素结点(注意不设头指针)试编写相应的队列初始化、入队列和出队列的算法。
(1)初始化
void InitQueue(LinkQueue *Q)
{
QueueNode *s;
Q->rear=Q->rear->next; //将队尾指针指向头结点
while(Q->rear!=Q->rear->next) //当队列非空,将队中元素逐个出队
{
s=Q->rear->next;
Q->rear->next=s->next;
free(s); //回收结点空间
}
}
(2)入队列
void EnQueue(LinkQueue *Q,Datatype x) //入队,也就是在尾节点 处插入元素
{
QueueNode *p=(QueueNode *)malloc(sizeof(QueueNode)); //申请新结点
p->data=x;
p->next=Q->rear->next; //初始化新结点并链入
Q-rear->next=p;
Q->rear=p; //将尾指针移至新结点
}
(3)出队列
Datatype DeQueue(LinkQueue *Q) //出队,把头结点之后的元素摘下
{
Datatype t;
QueueNode *P;
if(EmptyQueue(Q))
Error("Queue underflow");
p=Q->rear->next->next; //p指向将要摘下得结点
x=p->data; //保存结点中的数据
if(p==Q->rear) //当队列中只有一个结点时,p结点出队后,要将队尾指针指向头结点
{
Q->rear=Q->rear->next;
Q->rear->next=p->next;
}
else
Q->rear->next->next=p->next;
free(p); //摘下结点p
return x; //释放被删结点
}
//要求循环队列不损失一个空间全部都能得到利用,设置一个标志tag,以tag为0或1来区分头尾指针相同时的队列状态的空与满,请编写与此相应的入队与出队算法
(1)入队
int EnterQueue(SeqQueue *Q, SeqQueueElemType x)
{
if(Q->front == Q->rear && Q->tag == 1)
{
printf("操作提示:队已满!");
return error;
}
else
{
Q->elem[Q->rear] = x;
Q->rear = (Q->rear+1) % MAXSIZE;//通过求模运算实现循环
if(Q->front == Q->rear) //如果此时队头和队尾相等,则设置tag为1,表示队列已满
{
Q->tag = 1;
}
}
}
(2)出队
int DeleteQueue(SeqQueue *Q, SeqQueueElemType *x)
{
if(Q->front == Q->rear && Q->tag == 0)
{
printf("操作提示:队为空!");
return error;
}
else
{
*x = Q->elem[Q->front];
Q->front = (Q->front+1) % MAXSIZE;
if(Q->front == Q->rear) //如果此时队头和队尾相等,则设置tag为0,表示队列为空
{
Q->tag = 0;
}
}
}
栈-数据结构-耿国华-第三章(部分算法)
最新推荐文章于 2022-07-29 15:32:11 发布