一、栈的定义
栈( stack)是限定仅在表尾进行插入和删除操作的线性表。
我们把允许插入和删除的一端称为栈顶(top), 另一端称为栈底(bottom), 不含任何数据元素的栈称为空栈。栈又称为后进先出(Last In First Out)的线性表,简称LIFO结构。
栈是一个特殊的线性表,栈元素具有前驱和后继的关系。它是在表尾进行删除和插入操作的。这里的表尾是指栈顶不是栈尾。
栈的插入操作也叫进栈、压栈、入栈。
栈的删除操作也叫出栈也有叫弹栈。
具体表示如下图所示:
入栈:
出栈
栈又分为顺序栈和链栈。顺序栈是由数组实现的,链栈是由链表实现的。这篇博客我们主要实现一下顺序栈的基本实现
二、栈的顺序结构的简单实现
1、顺序栈的整体定义
#define STACK_SIZE 10
typedef struct stack
{
ElemType data[STACK_SIZE];//data 栈数据空间
int top;//栈顶指针
}stack;*pstack
2、初始化(init)
void init(pstack pst)
{
if(pst != NULL)
{
pst->top = 0;
}
}
3、压栈(push)
压栈的时候我们首先要进行判满的操作。所以我们得先实现判满的函数(full)
int full(pstack pst)
{
rerurn pst->top == STACK_SIZE ?1:0;
}
压栈操作(push)
int push(pstack pst ,ElemType val)
{
if(full(pst))
{
return 0;
}
pst->data[pst->top] = val;
pst->top++;
return 1;
}
4、出栈(pop)
在进行出栈操作之前我们得先判断栈是否为空,栈为空证明没有元素可删。所以我们得先进行判空的操作
int empty(pstack pst)
{
return pst->top == 0 ? 1: 0;
}
出栈操作
int pop(pstack pst)//只删除元素,不获取元素
{
if(empty(pst))
{
return 0;
}
pst->top--;//data[top - 1]是无法将元素删除的。我们只需要将top--,就可以删除元素。
return 1;
}
5、获取元素
//返回值返回状态 形参把栈顶元素带出
int gettop(pstack pst,ElemType* prt)//拿到栈顶元素,不删除元素
{
if(empty(pst))//栈空
{
return 0;
}
*prt = pst->data[pst->top-1];
return 1;
}