栈 是一个容器,存到里面的数据是有顺序性的
例如我要存有顺序的 1 2 3
可以是一下几种
1.进 1 ,出 1 ,进 2, 出 2 ,进 3, 出 3 结果1 2 3
2.进 1 ,进 2 ,出 2,进3,出3,出1 结果2 3 1
3.进1 ,进2,进3,出3,出2,出1 结果3 2 1
4.进1 ,出1,进2,进3,出3,出2 结果 1 3 2
1只能是最先进去的,3值能使最后进去的
就是因为在读入的时候它们是由顺序的,在栈中不能改变顺序。
它就像一个杯子,最后放在里面的弹珠,总会第一个出来。(先进后出,后进先出)
下面是普通的栈空间的运用:
#include <stdio.h>
#include <malloc.h>
typedef struct track 这个栈只能存整形的值 这里自定义栈类型
{
int *value; 有一个整形的值指针
int size; 长度
int top; 下标
}Track;
void init(Track *track,int size) 初始化栈空间
{
track->size = size;
track->top = -1; 如果这个赋值为0的话,最后会多输出一个地址(博主也不知道为什么)
track->value = (int*)malloc(size * sizeof(int)); 数据是要空间才能存放
}
int input_value(Track *track , int value) 传入数值
{
if(track->size == 0) 预判这个栈空间是否为空
return 0;
track->top++; 下标从0开始
track->value[track->top] = value; 赋值
return 1;
}
int output_value(Track *track) 输出数值
{
if(track->top == -1) 预判这个最后的下标指向的栈空间是否存在
return 0;
int value = track->value[track->top]; 用一个变量存放要输出的值
track->top--;
return value;
}
int back_top(Track *track) 回到栈顶的值
{
if(track->top == -1) 预判栈顶的值的下标是否存在
return 0;
int value = track->value[track->top];
return value;
}
int Isempty(Track *track) 设定空栈的标志
{
return track->top == -1;
}
int Isfull(Track *track) 满栈的标志
{
return track->top == track->size;
}
int main()
{
Track track;
init(&track,5);
input_value(&track,1);
input_value(&track,12);
input_value(&track,123);
input_value(&track,1234);
while(!Isempty(&track))
{
printf("%5d",output_value(&track));
}
return 0;
}
下面是在链表中栈的运用:
#include <stdio.h>
#include <malloc.h>
typedef struct LIST
{
int value;
struct LIST *next; 实现链表
}list_point;
typedef struct track
{
list_point *point; 实现栈头 栈头指向链表
}Link_point;
void init(Link_point *track) 初始化栈
{
track->point = NULL;
}
int input_value(Link_point *track,int value) 读入数值
{
list_point *p = (list_point *)malloc(sizeof(list_point));
值在链表中实现,就要向系统申请链表的空间
p->value = value;
p->next = track->point; 这里类似头指针 运用的是头插法
track->point = p;
return 1;
}
int output_value(Link_point *track) 输出数值
{
list_point *p = track->point;
int value = p->value;
track->point = p->next;
free(p);
把栈头赋给链表头,由链表头输出栈头所指向的值
然后栈头指向链表头(栈头)后面的节点
最后free掉原来的栈头
return value;
}
int Isempty(Link_point *track) 设定空栈的标志
{
return track->point == NULL;
}
int main()
{
Link_point track;
init(&track);
input_value(&track,1);
input_value(&track,12);
input_value(&track,123);
input_value(&track,1234);
while(!Isempty(&track))
{
printf("%5d",output_value(&track));
}
return 0;
}