栈和队列
栈和队列不是一种特殊的数据结构
它们是一种思想
栈:先进后出,后进先出
队列:先进先出,后进后出
栈:都是线性表
栈有两端
1 栈顶:进行插入和删除的一段
2 栈底: 一般我们不做操作
我们可以用顺序结构或者是链式结构去实现这个栈的思想
利用链式结构去实现这个栈,实际上我们的操作就是一个带头节点的单链表
一般我们操作栈要实现如下的操作
1 初始化一个栈 StackInit
2 销毁栈 StackDestory;
3 清空栈 StackClear
4 判断这个栈是否为空 StackIsEmpty
5 返回栈里面多少个元素 StackGetLength
6 返回栈顶元素,不出栈 StackGetTop
7 入栈 Push
8 出栈 Pop
typedef int ElemType;
#define Max 1024 //定义最大空间
#define StackErro INT32_MIN //定义错误码
typedef struct Stact_Node
{
ElemType data;
struct Stact_Node* next;
}Node;
typedef struct Stack_Head
{
int MaxNum; //此时栈内最大空间
int Num; //栈内节点个数
struct Stact_Node* top; //栈顶
struct Stact_Node* bottom; //栈低
}Head;
实现栈的出栈入栈
//栈的初始化
Head* StackInit(int MaxNum) //MaxNum是在Test.c中开辟的最大空间
{
if (MaxNum <= 0 || MaxNum > 1024) //判断开辟的空间大小是否正常
{
MaxNum = 1024;
}
//建立头结点
Head* st = (Head*)malloc(sizeof(Head));
if (!st) //头结点开辟失败
{
return NULL;
}
st->bottom = NULL;
st->top = NULL;
st->Num = 0;
st->MaxNum = MaxNum;
return st;
}
//入栈的时候产生一个节点
//节点初始化
static Node* CreatStackNode(const ElemType data)
{
Node* pnew = malloc(sizeof(Node));
pnew->next = NULL;
pnew->data = data;
return pnew;
}
//判断栈为空
//为空返回true,不为空返回false
bool StackIsEmpty(Head* st)
{
if (st == NULL || st->Num == 0)
{
return true;
}
else
{
return false;
}
}
//返回栈里面多少个元素
//失败返回-1
int StackGetLenth(Head* st)
{
if (!st)
{
return -1;
}
return st->Num;
}
//入栈
void Push(Head* st, ElemType data)
{
if (!st)
{
printf("栈不存在,无法入栈\n");
return;
}
if (st->Num >= st->MaxNum)
{
printf("栈满了,无法入栈\n");
return;
}
Node* pnew = CreatStackNode(data);
if (StackIsEmpty(st))
{
st->bottom = pnew;
st->top = pnew;
}
else
{
pnew->next = st->top;
st->top = pnew;
}
st->Num++;
}
//出栈
//失败返回错误码
ElemType Pop(Head* st)
{
if (!st)
{
printf("栈不存在,无法出栈\n");
return StackErro;
}
if (StackIsEmpty(st))
{
printf("栈为空,无法出栈\n");
return StackErro;
}
ElemType data = st->top->data;
Node* p;
//栈内只有一个元素
if (StackGetLenth(st) == 1)
{
p = st->top;
st->top = st->bottom = NULL;
}
else
{
p = st->top;
st->top = st->top->next;
p->next = NULL;
}
free(p);
st->Num--;
return data;
}
栈的销毁和清空(重要的一步)
//清空栈
void StackClear(Head* st)
{
if (st == NULL)
{
return;
}
while (!StackIsEmpty(st))//只要不是空就循环出栈
{
Pop(st);//出栈
}
}
//销毁栈
void StackDestory(Head ** st)
{
//空栈
if (st == NULL || *st == NULL)
{
return;
}
StackClear(*st);
*st = NULL;
}
注:因为篇幅问题,队列接着下一篇继续讲解