前言
链式栈不需要二级指针
,求栈长不需要函数遍历
链式队列不需要两个指针
,求队长不需要函数遍历
只要你会单链表的头插
和尾插
写法
首先,我们先固定出口
,把链表头节点后的第一个节点作为出口。
通过改变插入的方式
是不是就实现了入栈或者入列?
想要入栈
就用头插法
,是不是符合先进后出?
想要入列
就用尾插法
,是不是符合先进先出?
当我写完栈或队列,只要把插入方法一换
,是不是就实现了栈和队列的互换
,其它代码可以通用?
头节点的data
,我们让它来记录栈(队列)个数
,每次入或删
都让data+-
,那data是不是就是长度?
一、链式队列
#include <stdio.h>
#include <stdlib.h>
typedef struct Node
{
int data;//记录队列个数
struct Node* next;
}Node;
// 初始化函数
Node* initQueue()
{
// 开辟空间,创建节点
Node* head = (Node*)malloc(sizeof(Node));
// 容错判断 略
head->data = 0;//存储队列个数
head->next = NULL;
return head;
}
// 入列:尾插法
void inQueue(Node* queue, int data)
{
// 开辟空间,创建节点
Node* node = (Node*)malloc(sizeof(Node));
// 容错判断 略
// 存放数据
node->data = data;
// 找到最后一个节点,在后面插入
// 最后节点特征:next为空
// 创建头节点指针复制品,用来移动
Node* queue_cp = queue;
// 移动到最后
while (queue_cp->next != NULL)
{
queue_cp = queue_cp->next;
}
// 插入
// 改变要插入节点指向
node->next = queue_cp->next;
// 原尾节点指向新尾节点
queue_cp->next = node;
// 队列个数++
queue->data++;
}
// 判空
int isNullQueue(Node* queue)
{
// 当队列个数data为0时,队列为空
return queue->data == 0;
}
// 出列:每次都是将头节点后面节点出队
int outQueue(Node* queue)
{
// 判断空队列
if (isNullQueue(queue))
{
printf("空队列\n");
return -1;
}
// 指向要出队的节点
Node* head_next = queue->next;
// 取出数据
int data = head_next->data;
// 跨过第一个节点
queue->next = head_next->next;
// 释放第一个节点
free(head_next);
head_next = NULL;
// 队列个数--
queue->data--;
// 返回数据
return data;
}
// 清空列
void noneQueue(Node* queue)
{
// 当头节点next不为null时,一直进行出列
while (queue->next != NULL)
{
printf("出列:%d\n", outQueue(queue));
}
}
// 查看队列:同链表遍历
void printQueue(Node* queue)
{
Node* queue_cp = queue->next;
while (queue_cp)
{
printf("%d<-", queue_cp->data);
queue_cp = queue_cp->next;
}
printf("NULL\n");
}
int main(int argc, char const *argv[])
{
// 初始化
Node* queue = initQueue();
inQueue(queue, 1);//入1
inQueue(queue, 2);//入2
inQueue(queue, 3);//入3
inQueue(queue, 4);//入4
inQueue(queue, 5);//入5
printf("长度:%d\n", queue->data);//列长
printQueue(queue);//查看
printf("出列:%d\n", outQueue(queue));//出列
printQueue(queue);//查看
printf("出列:%d\n", outQueue(queue));//出列
printQueue(queue);//查看
noneQueue(queue);//清空列
printQueue(queue);//查看
return 0;
}
二、链式栈
// 入栈:头插法
void inQueue(Node* queue, int data)
{
// 开辟空间,创建节点
Node* node = (Node*)malloc(sizeof(Node));
// 容错判断 略
// 存放数据
node->data = data;
// 改变node指向
node->next = queue->next;
// 改变queue指向
queue->next = node;
queue->data++;
}