一,栈的顺序结构的实现
利用结构体的成员来定义栈的底部指针和顶部指针,以及栈的大小
#include <stdio.h>
#include <stdlib.h>
#define MAX(X,Y) (X>Y?X:Y)
#define MAXSIZE 10
typedef struct Sq//创建栈的结构体
{
int* top;//栈顶
int* base;//栈底
int sz;//栈的大小
}Sq;
void Creat_stack(Sq* p)//初始化栈
{
p->base = (int*)malloc(sizeof(int)*MAXSIZE);//设置栈底指针和栈的空间
if(!p->base)
{
printf("申请栈内存失败!")
return;//判断申请栈内存是否成功
}
else
{
p->top = p->base;//栈顶等于栈底(空栈)
p->sz = MAXSIZE;//设置栈的大小
}
}
int main()
{
Sq stack_sq;//创建结构体变量
Creat_stack(&stack_sq);
printf("%d",stack_sq.sz);
return 0;
}
1,顺序栈的操作,压栈
2,出栈
总结:顺序栈好理解,本来内存里的数据就是顺序存储的,操作起来也方便.但是栈的空间是固定大小的,容易造成溢出,不好控制,如果栈的大小不够,还需要人为的重新申请空间.
完整代码:
#include <stdio.h>
#include <stdlib.h>
#define MAX(X,Y) (X>Y?X:Y)
#define MAXSIZE 10
typedef struct Sq//创建栈的结构体
{
int* top;//栈顶
int* base;//栈底
int sz;//栈的大小
}Sq;
void Creat_stack(Sq* p)//初始化栈
{
p->base = (int*)malloc(sizeof(int)*MAXSIZE);//设置栈底指针和栈的空间
if(!p->base)
{
printf("申请栈内存失败!");
return;//判断申请栈内存是否成功
}
else
{
p->top = p->base;//栈顶等于栈底(空栈)
p->sz = MAXSIZE;//设置栈的大小
}
}
void push_stack(Sq* p, int a)//压栈
{
if((p->top - p->base) < p->sz)//判断栈是否已经满了,指针相减得到的就是元素个数
{
*p->top++ = a;//等价于 *p->top = a; p->top++;把栈顶指向的地址赋值a,然后栈顶+1
}
else
{
printf("栈已经满了,不能再push");
}
}
int pop_stack(Sq* p)//出栈
{
if((p->top - p->base) > 0)//判断栈是否为空栈
{
return *--p->top;//返回从栈中弹出的值,栈顶减1
}
else
{
printf("栈已经空了");
}
}
int main()
{
Sq stack_sq;//创建结构体变量
Creat_stack(&stack_sq);
push_stack(&stack_sq,5);//把整型5压栈
int a = pop_stack(&stack_sq);
printf("%d",a);
return 0;
}
二, 栈的链结构的实现
单链结构来表示栈,按我的理解就是把链反过来看,链的第一个元素当成栈顶,最后一个元素表示栈底,这样一来就好理解和操作了.而且这种链结构为了方便,不需要头结点,只需要一个指针来指向栈顶就行了.链的每一个元素的数据域表示成栈的某个类型的数据,地址域指向下一个元素
push和pop元素都只能从栈顶操作
#include <stdio.h>
#include <stdlib.h>
#define MAX(X,Y) (X>Y?X:Y)
#define MAXSIZE 10
typedef struct S//创建栈元素的结构体
{
int data;
struct S* p;
}S;
void push_stack(S** a, int b)//传过来的是指针的地址(地址的地址),所以要用二级指针来表示
{
S* tmp = (S*)malloc(sizeof(S));//创建一个内存空间用来存放栈元素
tmp->data = b;//给元素赋值
tmp->p = *a;//把元素的地址域指向指针地址
*a = tmp;//指针指向新添加的元素,当作栈顶(相当于指针+1)
}
int pop_stack(S** a)
{
int e = (*a)->data;//先保存指针指向的元素的数据
*a = (*a)->p;//把指针指向该元素的后继元素,并把这个后继元素当作栈顶(相当于指针-1)
return e;//把保存的数据返回
}
int main()
{
int a = 8;//定义一个整型数据
S* point = NULL;//定义栈指针,也可以称为栈的名字,设置为空
push_stack(&point, a);//向point栈里添加数据a(压栈)
printf("%d\n", point->data);//8
printf("%p\n", point->p);//00000000
push_stack(&point, 10);//向point栈顶添加数据10(压栈)
printf("%d\n", point->data);//10
printf("%p\n", point->p);//第一个元素的地址
a = pop_stack(&point);//从point栈顶弹出一个元素,并且赋值给a(出栈)
printf("%d\n",a);//因为栈的先进先出原则,所以弹出来的是10
printf("%d\n", point->data);//现在指针是指向后一个元素,就是8
return 0;
}