链式队列和两个栈如何实现一个队列

在这里插入图片描述
在这里插入图片描述
给头部指针新添加一个指针域指向尾部节点,这样头尾都可以在O(1)时间复杂度里访问。
在这里插入图片描述
用这样的代码改造单链表的结构体设计 会使得下面都出现一个新添加的指针域 如图所示。(只在头结点出现即可)
在这里插入图片描述
在这里插入图片描述
头文件 链式队列 lqueue.h

#pragma once 

typedef int ELEM_TYPE;

typedef struct Node
{
	ELEM_TYPE data;//数据域
	struct Node *next;//指针域
}Node, *PNode;

//我们对头结点重新设计其结构体
typedef struct Head
{
	struct Node *front;//一直指向第一个节点
	struct Node *rear;//一直指向最后一个节点
	//int length;//如果需要频繁获取队列的有效长度,可以加上length
}Head, *PHead;


//初始化
void Init_lqueue(PHead pq);

//入队
bool Push(PHead pq, ELEM_TYPE val);

//出队
bool Pop(PHead pq, int *rtval);

//获取队列顶部元素
bool Top(PHead pq, int *rtval);

//获取其有效长度个数
int Get_length(PHead pq);

//判空
bool IsEmpty(PHead pq);

判满   不需要判满
//bool IsFull(PHead pq);

//清空
void Clear(PHead pq);

//销毁
void Destroy(PHead pq);

void Show(PHead pq);

lqueue.cpp

#include <stdio.h>
#include <assert.h>
#include <stdlib.h>
#include "Lstack.h"
//作业:补全代码

//初始化
void Init_stack(PLStack ps)
{
	ps->next = NULL;
}

//入栈(或者叫压栈 push) 头插
bool Push(PLStack ps, ELEM_TYPE val)
{
	assert(ps != nullptr);
	LStack* pnewnode = (LStack*)malloc(sizeof(LStack*) * 1);
	assert(pnewnode != nullptr);
	pnewnode->data = val;
	pnewnode->next = ps->next;
	ps->next = pnewnode;
	return true;
}

//出栈 尾删(或者叫弹栈 pop(获取顶部数据,并且删除))//rtval是一个输出参数(C语言讲到)
bool Pop(PLStack ps, ELEM_TYPE* rtval)
{
	assert(ps != nullptr);
	LStack* p = ps;
	for (p; p->next->next != NULL; p = p->next);
	*rtval = p->next->data;
	LStack* q = p->next;
	p->next = q->next;
	//free(q);
	q = nullptr;
	return true;
}

//获取顶部元素值 top(获取顶部数据)
bool Top(PLStack ps, ELEM_TYPE* rtval)
{
	assert(ps != nullptr);
	LStack* p = ps;
	for (p; p->next != nullptr; p = p->next);//让p跑完指向最后一个节点
	*rtval = p->data;

	return true;
}

//获取其有效数据个数
int Get_length(PLStack ps)
{
	assert(ps != nullptr);

	int count = 0;
	for (LStack* p = ps; p->next != nullptr; p = p->next)
	{
		count++;
	}
	return count;
}


//清空   一间房住了一户人  清空相当于把人赶出去
void Clear(PLStack ps)
{
	Destroy(ps);
}

//销毁  一间房住了一户人  销毁相当于把人赶出去还把房烧了
void Destroy(PLStack ps)
{
	assert(ps != nullptr);
	while (ps->next != nullptr)
	{
		LStack* p = ps->next;
		ps->next = p->next;
		//free(p);
	}
	ps->next = nullptr;
}

//打印
void Show(PLStack ps)
{
	assert(ps != nullptr);
	for (LStack* p = ps->next; p != nullptr; p = p->next)
	{
		printf("%d  ", p->data);
	}
	printf("\n");
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值