1. 用队列实现栈
题目链接
思路:
一个队列放数据,一个队列为空(为了导队列数据),每次删除的时候交换两个队列的功能。
入栈功能:只往非空队列入数据,第一次入数据,随便入哪个队列,因为都是空队列

出栈功能:有数据的队列持续导入到空队列(取队头数据导入,出队删除本身的数据),直到最后一个数据,再将其输出后删除,这样实现了后进先出,此时就完成了刚才交换两个列队功能

取栈顶数据:有数据的队列最后一个数据就是栈顶,通过队列的特性,直接返回队尾数据即可

栈是否为空:两个队列为空,就返回true,不是就返回false
销毁:除了防止内存泄漏,我们需要把开辟了空间的地方都还回内存中,先free里层结构,在free外层结构

这里说明代码这个部分

修改结构体成员,需要传地址,运算符的优先级是先->,后&
所以是先找到结构体里面的成员变量,在取里面它的地址,就可以通过函数修改
2. 用栈实现队列
题目链接
思路:
一个栈用来入数据(pushST),一个栈用来出数据(popST),popST为空,就让pushST导数据进来。
入队:往专门用来入数据的栈(pushST),插入数据

出栈:popST没有数据就让pushST把数据导出来(出栈),所以先进去的数据会在pushST栈的栈顶,直接出栈就实现了先进先出

获取队头数据:popST的栈顶就是队头数据

销毁:和上一题一样,先销毁里层结构,在销毁外层结构,否则内存泄漏
注意只有在popST为空时候才能导数据,插入数据也只能在pushST,不然顺序就会被打乱

3. 队列实现栈源代码:
typedef int QDataType;
// 定义队列的单个节点
typedef struct QueueNode
{
QDataType data;
struct QueueNode* next;
}QueueNode;
// 定义队列
// 队列里面有头和尾结点,头和尾结点的类型是单个节点的结构
typedef struct Queue
{
QueueNode* head;
QueueNode* tail;
}Queue;
// 初始化
void QueueInit(Queue* pq);
// 判断队列是否为空
bool QueueEmpty(Queue* pq);
// 入队
void QueuePush(Queue* pq, QDataType x);
// 出队
void QueuePop(Queue* pq);
// 获取队头数据
QDataType QueueFront(Queue* pq);
// 获取队尾数据
QDataType QueueBack(Queue* pq);
// 获取队列数据个数
int QueueSize(Queue* pq);
// 销毁
void QueueDestroy(Queue* pq);
// 初始化
void QueueInit(Queue* pq)
{
assert(pq);
pq->head = NULL;
pq->tail = NULL;
}
// 判断队列是否为空
bool QueueEmpty(Queue* pq)
{
assert(pq);
return pq->head == NULL;
}
// 入队
void QueuePush(Queue* pq, QDataType x)
{
assert(pq);
// 创建新节点
QueueNode* newNode = (QueueNode*)malloc(sizeof(QueueNode));
assert(newNode);
newNode->data = x;
newNode->next = NULL;
// 插入数据分两种情况
// 1. 队列为空:头和尾赋值为新节点
// 2. 队列不为空:直接尾插,在更新尾结点
if (pq->head == NULL)
{
pq->head = pq->tail = newNode

最低0.47元/天 解锁文章
5633





