栈的概念:栈是一种先进后出的数据结构
栈分成了栈顶和栈底(在栈顶进行元素的插入和删除操作)
栈中进入数据成为--入栈 push
栈中弹出数据称为--出栈 pop
栈的存储
栈的存储方式有两种:顺序栈和链栈,即栈的顺序存储和链式存储。
栈的顺序存储(使用数组)
栈顶结构体
typedef struct Stack{
int data[MAX]; //数据域
int size; //栈的大小 栈中元素个数
}Stack,*SeqStack;
站的初始化
SeqStack create(){
//创建栈 相当于动态开辟一个数组出来
SeqStack p=(stack *)malloc(sizeof(Stack));
if(p==NULL){
return NULL;
}
//初始化栈的大小
p->size=0;
//初始化栈中的元素
for(int i=0;i<MAX;i++){
p->data[i]=0;
}
return p;
};
入栈
void push(SeqStack stack,int data){
if(stack==NULL){
return 0;
}
//入栈需要判断栈是否已满
if(stack->size==MAX){
printf("栈满!\n");
return 0;
}
//stack->size 栈的大小 就是我们插入的元素下一个位置
stack->data[stack->size]=data;
//改变栈的大小
stack->size++;
}
入栈需要注意 栈是否 不存在, 栈是否 已满
出栈
int pop(SeqStack stack){
if(stack==NULL){
return 0;
}
if(stack->size==0){
printf("栈已空");
return 0;
}
//删除一个元素
stack->data[stack->size-1]=0;
//改变栈的大小
stack->size--;
}
出栈 需要注意 栈是否 不存在, 和栈是否 已空
遍历栈中元素
int foreachStack(SeqStack stack){
if(stack==NULL){
return 0;
}
for(int i=0;i<stack->size;i++){
printf("%d ",stack->data[i]);
}
}
栈的链式存储
栈的链式存储结构体
//结点结构体
typedef struct Node {
int data;
struct Node *next;
}Node;
//栈的结构体
typedef struct Stack{
struct Node header; //头结点
int size; //栈的大小及元素个数
}Stack,*LinkStack;
栈的初始化
LinkStack init_LinkStack(){
//myStack 是指针,指向申请的空间
LinkStack myStack=(Stack *)malloc(sizeof(Stack));
if(myStack==NULL){
return NULL;
}
//初始化长度为0
myStack->size=0;
//相当于初始化链表的头结点指针域
myStack->header.next=NULL;
}
入栈
int push(LinkStack stack,int data){
if(stack==NULL){
return 0;
}
//创建一个结点
Node *p=(Node *)malloc(sizeof(Node));
//给结点数据域赋值
p->data=data;
//头插法 先连后边
p->next=stack->header.next;
stack->header.next=p;
//改变栈的个数
stack->size++;
}
出栈
int pop(LinkStack stack){
//判断栈存不存在
if(stack==NULL){
return 0;
}
//判断栈空
if(stack->size==0){
printf("栈中无元素");
return 0;
}
//定义一个 结点类型指针 用作 删除 结点
Node *p=stack->header.next;
//头结点 连接到删除结点后边
stack->header.next=p->next;
//释放结点
free(p);
//更新栈的大小
stack->size--;
}
栈的销毁
void destroy_LinkStack(LinkStack stack)
{
if (stack != NULL)
{
struct Node * pCur = stack->header.next;
while (pCur != NULL)
{
//先保存住下一个节点的位置
struct Node * pNext = pCur->next;
//释放节点
free(pCur);
pCur = pNext;
}
free(stack);
stack = NULL;
}
}