栈的顺序结构和链结构的实现和操作

一,栈的顺序结构的实现

利用结构体的成员来定义栈的底部指针和顶部指针,以及栈的大小

#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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值