栈-数据结构-耿国华-第三章(部分算法)

//给出栈的两种存储结构形式名称,在这两种栈的存储结构中如何判别栈空与栈满?
 (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;
        }
    }
}
  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值