一、栈和队列
栈和队列都是对结点操作位置有要求的特殊线性表
栈(先进后出)----->子弹入膛
队列(先进先出)----->食堂排队
二、栈(数据结构)
1.概念
线性表的插入(压栈)和删除(出栈)都只能在同一个端点进行,不能在其他位置,这样的结构称之为栈
2.分类
顺序栈、链式栈(带头结点的单向不循环链表)
3.特性
后进先出,一端是完全封死的,只有另外一端是用来控制和插入的,所以说,最先进来的结点肯定是最后出去的
4.链式栈(stack)
其实就是一个头插头删或者尾插尾删的链表
三、链式栈的设计和创建
1.设计:
typedef int SElemType_t;
//数据结点
struct node
{
SElemType_t data;
struct node *next;
};
//链式栈的管理结构体(头结点)
struct list_stack
{
struct node *stack;//保存首结点的地址
int size;//栈结构体中元素的个数(结点个数)
};
struct list_stack *managerStack;
//2.初始化栈
bool init_stack()
{
//1)申请栈管理结构体的内存空间
managerStack=malloc(sizeof(struct list_stack));
if(managerStack==NULL)
{
printf("malloc managerStack error\n");
return false;
}
//2)初始化
managerStack->size=0;
managerStack->stack=NULL;
return true;
}
//3.入栈(压栈)
bool push(SElemType_t inputData)
{
//1、申请栈元素的结点的内存空间
struct node *newNode=malloc(sizeof(struct node));
if(newNode==NULL)
{
printf("malloc newNode error\n");
return false;
}
//2、初始化
newNode->data=inputData;
newNode->next=NULL;
//3、插入
if(managerStack->stack==NULL)//从无到有
{
managerStack->stack=newNode;
}
else//(由少到多)(头插)
{
newNode->next=managerStack->stack;
//更新首结点
managerStack->stack=newNode;
}
//栈元素+1
managerStack->size++;
return true;
}
bool isEmpty()
{
return managerStack->size==0;
}
//出栈--删除(头删)
bool pop(SElemType_t *outData)
{
//1、先判断当前有没有栈元素
if(isEmpty())
return false;
//2、先获取出栈的数据
*outData=managerStack->stack->data;
//先定义一个临时的指针存储当前删除结点的地址
struct node*delNode=managerStack->stack;
//更新首结点
managerStack->stack=delNode->next;
//释放
free(delNode);
//size--
managerStack->size--;
return true;
}
//销毁栈
void destory_stack()
{
if(managerStack==NULL)
return;
//1.遍历所有的结点,每个点都删除
struct node *p=managerStack->stack;
struct node *pnext=NULL;
while(p)
{
pnext=p->next;
free(p);
p=pnext;
}
//2.释放头结点(栈管理结构体)
free(managerStack);
managerStack=NULL;
}
demo.c
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
typedef int SElemType_t;
struct node{
SElemType_t data;
struct node *next;
};
struct list_stack
{
struct node *stack;
int size;
};
struct list_stack *managerStack;
bool init_stack()
{
managerStack = malloc(sizeof(struct list_stack));
if(managerStack == NULL)
{
printf("malloc managerStack error\n");
return false;
}
managerStack->size = 0;
managerStack->stack = NULL;
return true;
}
bool push(SElemType_t inputData)
{
struct node *newNode = malloc(sizeof(struct node));
if(newNode==NULL)
{
printf("malloc newNode error\n");
return false;
}
newNode->data = inputData;
newNode->next = NULL;
if(managerStack->stack == NULL)
{
managerStack->stack = newNode;
}
else
{
newNode->next = managerStack->stack;
managerStack->stack = newNode;
}
managerStack->size++;
return true;
}
bool isEmpty()
{
return managerStack->size==0;
}
//出栈--删除(头删)
bool pop(SElemType_t *outData)
{
//1、先判断当前有没有栈元素
if(isEmpty())
return false;
//2、先获取出栈的数据
*outData=managerStack->stack->data;
//先定义一个临时的指针存储当前删除结点的地址
struct node*delNode=managerStack->stack;
//更新首结点
managerStack->stack=delNode->next;
//释放
free(delNode);
//size--
managerStack->size--;
return true;
}
//销毁栈
void destory_stack()
{
if(managerStack==NULL)
return;
//1.遍历所有的结点,每个点都删除
struct node *p=managerStack->stack;
struct node *pnext=NULL;
while(p)
{