前言
栈(stack):是线性表的一种,限制仅在线性表的一端进行插入和删除操作。其中允许插入和删除的一端称为栈顶(top),不允许插入和删除的一端称为栈底(bottom)。
下面废话不多说直接直接上代码
数组栈
/*************************************************************************
> File Name: c.mintue/stack.c
> Author: Gnglas
> Mail: 2254228017@qq.com
> Created Time: 2020年01月01日 星期三 22时17分59秒
************************************************************************/
/*
*1.初始化栈
*2.判断栈是否为空
*3.设置栈为空
*4.插入数据 -----判断栈是否已满
*5.删除数据 -----判断栈是否为空
*
* */
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define N 10
struct _stack
{
int man;
int a[N];
};
struct _stack stack = {
-1 ,{
0
}
};//初始化
int seqstack()
{
if (stack.man == -1)
{
return 1;
}
else
return 0;
}
void push(int m)//插入数据
{
if(stack.man + 1 == N )
return;
else{
stack.man+=1;
stack.a[stack.man] = m;
printf("成功插入%d\n",m);
}
}
int pop()//删除数据
{
if(stack.man == -1)
return 1;
else
{
printf("删除数据%d\n",stack.a[stack.man]);
stack.man -= 1;
return 0;
}
}
void free_stack()
{
stack.man = -1;
}
int main()
{
int i,n=0;
for(i=0;i<N;i++)
{
scanf("%d",&n);
push(n);
}
while(!seqstack())
{
pop();
}
return 0;
}
链表栈
/*************************************************************************
> File Name: lstack.c
> Author: Gnglas
> Mail: 2254228017@qq.com
> Created Time: 2020年01月10日 星期五 15时19分03秒
************************************************************************/
#include<stdio.h>
#include<stdlib.h>
typedef struct NODE
{
int Lsize;
int man;
struct NODE *next;
}Stack;
void LnltStack(Stack *stack) //初始化链表
{
stack->Lsize = 0; //存储链表数量
stack->man = 0; //存储链表数据
stack->next = NULL; //存储链表的下一个节点的地址
}
Stack *PushStack(Stack *stack ,int men) //插入链表
{
//判断链表是否为空
if(stack->Lsize == 0)
{
stack->Lsize += 1;
stack->man = men;
stack->next = NULL;
return stack;
}
else
{
printf("正在分配内存.....\n");
Stack* new = malloc (sizeof (Stack));
if(!new)
exit(1);
printf("分配内存成功!\n");
new->Lsize = stack->Lsize + 1;
new->man = men;
new->next = stack;
return new;
}
}
Stack* PopStack(Stack *stack) //弹出栈
{
//替换栈顶数值
printf("弹出%d\n",stack->man);
printf("弹出数据成功.....\n");
stack = stack->next;
return stack;
}
void ClearStack(Stack *stack) //清空栈
{
Stack *new;
while(stack->next != NULL)
{
new = stack->next;
free(stack);
stack = new;
}
free(stack);
printf("栈清理完毕!");
}
int JudegStack( Stack *stack) //判断栈是否为空
{
if(!stack->next)
return 1;
else
return 0;
}
void LntStack(Stack *stack) //计算栈的节点数量
{
printf("栈长度为%d \n",stack->Lsize);
}
int main()
{
int ma,am;
Stack *stack = malloc (sizeof (Stack));
LnltStack(stack);
printf("初始化链表.....\n");
printf("插入链表.,...\n");
for(ma=1;ma <= 5;ma++)
{
printf("插入数值%d\n",ma);
stack=PushStack(stack,ma);
}
LntStack(stack);
printf("弹出链表.....\n");
stack = PopStack(stack);
printf("清空链表....\n");
ClearStack(stack);
return 0;
}