目录
栈
栈的概念
栈(stack)是一种线性表,与其他线性表相比删除与输入都是再同一个地方进出
压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶。
出栈:栈的删除操作叫做出栈。出数据也在栈顶。

栈的实现
栈的结构体与初始化
stack.h
cpp
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <stdbool.h>
typedef int SNODEDetaTpye;
typedef struct StackNODE
{
SNODEDetaTpye data;
struct StackNODE* next;
}SNODE;
void SNODEInit(SNODE* head);//初始化
void SNODEDestory(SNODE* head);//销毁栈
stack.c
cpp
#define _CRT_SECURE_NO_WARNINGS
#include "stack.h"
void SNODEInit(SNODE* head)//初始化函数
{
head->next = NULL;
head->data = 0;
return;
}
栈的销毁函数
cpp
void SNODEDestory(SNODE* head)//销毁栈
{
SNODE* dest, *pnode = head->next;
while (pnode != NULL)
{
dest = pnode;
pnode = pnode->next;
free(dest);
dest = NULL;
}
return;
}
判断栈的是否为空栈
cpp
bool SNODEEmpty(SNODE* head)//判断是否为空栈
{
if (head->next == NULL)
return true;
else
return false;
}
栈的入栈函数
cpp
void SNODEPush(SNODE* phead, SNODEDetaTpye a)//入栈函数
{
SNODE* newhead = (SNODE*)malloc(sizeof(SNODE));
if (newhead == NULL)
{
perror("malloc");
exit(1);
}
newhead->next = phead->next;
phead->next = newhead;
phead->next->data = a;
return;
}
void Print(SNODE* head)//输出
{
SNODE* phead = head;
phead = phead->next;
while (phead)
{
printf(" %d ->", phead->data);
phead = phead->next;
}
printf("\n");
return;
}
int main()
{
SNODE head;
SNODEInit(&head);
SNODEPush(&head, 1);
SNODEPush(&head, 2);
SNODEPush(&head, 3);
SNODEPush(&head, 4);
Print(&head);
SNODEDestory(&head);
return 0;
}

栈的出栈函数
cpp
void SNODEPop(SNODE* head)
{
if (SNODE_Empty(head))
{
printf("栈为空函数\n");
return;
}
else
{
SNODE* pop = head->next;
head->next = head->next->next;
free(pop);
pop = NULL;
}
return;
}
int main()
{
SNODE head;
SNODEInit(&head);
SNODEPush(&head, 1);
SNODEPush(&head, 2);
SNODEPush(&head, 3);
SNODEPush(&head, 4);
Print(&head);
SNODE_Pop(&head);
Print(&head);
SNODE_Pop(&head);
Print(&head);
SNODE_Pop(&head);
Print(&head);
SNODE_Pop(&head);
Print(&head);
SNODE_Pop(&head);
SNODEDestory(&head);
return 0;
}

取栈的有效元素个数
cpp
int SNODE_Fine(SNODE* head)//查找有效元素个数,就是入栈的个数
{
SNODE* phead = head->next;
int num=0;
while (phead)
{
num++;
phead = phead->next;
}
return num;
}
int main()
{
SNODE head;
SNODEInit(&head);
SNODEPush(&head, 1);
SNODEPush(&head, 2);
SNODEPush(&head, 3);
SNODEPush(&head, 4);
printf("有效个数:%d\n", SNODE_Fine(&head));
Print(&head);
SNODE_Pop(&head);
printf("有效个数:%d\n", SNODE_Fine(&head));
Print(&head);
SNODE_Pop(&head);
printf("有效个数:%d\n", SNODE_Fine(&head));
Print(&head);
SNODE_Pop(&head);
printf("有效个数:%d\n", SNODE_Fine(&head));
Print(&head);
SNODE_Pop(&head);
printf("有效个数:%d\n", SNODE_Fine(&head));
Print(&head);
SNODE_Pop(&head);
printf("有效个数:%d\n", SNODE_Fine(&head));
SNODEDestory(&head);
return 0;
}

队
队的概念
(queue)
在现实世界里,排队我们肯定从队尾进入,从队头出去,那么队的概念就是这样的,有两个口一个负责入队,一个口负责出队。
入队列:进行插入操作的一端称为队尾
出队列:进行删除操作的一端称为队头

队的实现
队的结构体和头尾指针结构体
cpp
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <stdbool.h>
typedef int DateType;
typedef struct queuendoe
{
DateType data;
struct queuenode* next;
}QN;
typedef struct queue
{
QN* phead;
QN* ptail;
int size;
}Q;
队的初始函数
cpp
void queue_init(Q* queue)//初始化
{
QN* phead = (QN*)malloc(sizeof(QN));//哨兵位
if (phead == NULL)
{
perror("malloc");
exit(1);
}
phead->next = NULL;
queue->phead = queue->ptail = phead;
queue->size = 0;
return;
}
队的销毁函数
cpp
void queue_destory(Q* queue)//销毁队
{
QN* dest;
while (queue->phead != queue->ptail)
{
dest = queue->phead;
queue->phead = queue->phead->next;
free(dest);
dest = NULL;
queue->size--;
}
printf("队列销毁成功");
return;
}
队的入队函数
cpp
void queue_push(Q* queue, DateType a)//入队
{
QN* node = (QN*)malloc(sizeof(QN));
if (node == NULL)
{
perror("malloc");
exit(1);
}
node->data = a;
node->next = NULL;
queue->ptail->next = node;
queue->ptail = node;
queue->size++;
return;
}
队的出队函数
cpp
void queue_pop(Q* queue)//出队函数
{
assert(queue!=NULL);
if (queue->size)
{
QN* pop;
pop = queue->phead;
queue->phead = queue->phead->next;
free(pop);
pop = NULL;
queue->size--;
}
else
{
printf("队列为空\n");
}
return;
}
主函数的实现
cpp
void print(Q* queue)//输出
{
QN* p = queue->phead->next;
while (p != NULL)
{
printf(" %d ->", p->data);
p = p->next;
}
printf("\n");
return;
}
int main()
{
Q queue;
queue_init(&queue);
queue_push(&queue, 1);
queue_push(&queue, 2);
queue_push(&queue, 3);
queue_push(&queue, 4);
print(&queue);
queue_pop(&queue);
print(&queue);
queue_pop(&queue);
print(&queue);
queue_pop(&queue);
print(&queue);
queue_pop(&queue);
print(&queue);
queue_pop(&queue);
queue_init(&queue);
queue_push(&queue, 1);
queue_push(&queue, 2);
queue_push(&queue, 3);
queue_push(&queue, 4);
print(&queue);
queue_destory(&queue);
return;
}
输出结果:

感谢观看!
悠仁さん