【数据结构】栈学习之数组实现(C语言)

问题1:结构体指针变量

结构体指针变量的主要作用是存储其结构体变量的地址或结构体数组的地址,然后通过间接地方式操作对应的变量和数组。结构体指针变量与其他类型的变量一样都是用来存储地址的。

问题2:

在写数组栈的时候,遇到了一些代码。例如:typedef int SElemType; typedef int Status;并且在实际操作中Status用来定义函数的返回值类型。即:status  函数名()。之后才明白这些都是为了提高代码的可读性而设计的。Status表示函数的返回值的状态值。同时还定义一些字符像:OK ,ERROR等作为返回值。

问题3:关于引用

1、引用是C++对C语言的重要扩充,作用是为变量起一个别名,对引用的操作与对变量的操作完全一样。

   引用的声明方法:类型标识符  &引用名  =  目标变量名 (注:& 不是求地址运算,而是起标识作用)

   注意:(1)类型标识符是指目标变量的类型

         (2)声明引用时,必须同时对起进行初始化

         (3)引用声明完毕后,相当于目标变量名有两个名称,即该目标原名称和引用名,且不能再把该引用名作为其他变量名的别名

              例:int a;  &b = a; a为目标原名称,b为目标引用名。且a = 1 相当于b = 1

问题四:

在实现初始化栈的时候,将S->top = S->base;写成S->base = S->top,结果导致怎么也不出结果,最后才找到原因。原先以为S->top与S->base哪个在前都无所谓,最后才

发现,其实S->top在开始时没有赋值的,S->top是一个野指针。因此不能将S->base = S->top。

代码实现如下:

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <stdbool.h>

#define STACK_INIT_SIZE 100 //存储空间初始分配
#define STACKINCREMENT  10  //存储空间非配总量
typedef int SElemType;
typedef int Status;

typedef struct stack
{
    int *base;
    int *top;
    int stacksize;
}Sqstack,*PSqstack;

/***************************************
操作功能:初始化栈
***************************************/
PSqstack Init_stack(PSqstack S)
{
    S->base = (SElemType *)malloc(STACK_INIT_SIZE * sizeof(SElemType));
    if(!S->base)
    {
        printf("内存分配失败\n");
        exit(-1);
    }
    S->top = S->base;//不要写成S->base = S->top
    S->stacksize = STACK_INIT_SIZE;
    return S;
}
/*****************************************
操作功能:判断栈是否为空
*****************************************/
bool is_empty(Sqstack S)
{
    if(S.top == S.base)
        return true;
    else
    return false;
}

/*****************************************
操作功能:销毁栈
*****************************************/
int DestroyStack(PSqstack S)
{
    if(!S->base)
        exit(-1);
    S->stacksize = 0;
    free(S->base);
    free(S->top);
    printf("栈销毁成功\n");
    return 0;
}
/*****************************************
操作功能:入栈
*****************************************/
int Push(PSqstack S, int e)
{
    if(S->top - S->base >= S->stacksize)
    {
        S->base = (SElemType *)realloc(S->base, (S->stacksize + STACKINCREMENT) * sizeof(SElemType));
        if(!S->base)
        {
            printf("内存分配失败\n");
            exit(-1);
        }
        S->top = S->base + S->stacksize;
        S->stacksize += STACKINCREMENT;
    }
    *S->top ++ = e;
    return 0;
}
/********************************************
操作功能:出栈
********************************************/
int Pop(PSqstack S, int *val)
{
    if(S->base == S->top)
    {
        printf("出栈失败");
        exit(-1);
    }
    S->top --;
    *val = *(S->top) ;
    return 0;
}
/********************************************
操作功能:取栈顶元素
********************************************/
int GetTop(PSqstack S, int *val)
{
    if(S->base == S->top)
    {
        printf("出栈失败");
        exit(-1);
    }
    *val = *(S->top -1) ;
    return 0;
}
/********************************************
操作功能:遍历栈
********************************************/
int Traverse(PSqstack S)
{
    int *p, i;
    if(S->top == S->base)
    {
        printf("遍历失败\n");
        exit(-1);
    }
    p = S->top - 1;
    while(p >= S->base)
    {
        printf("%d ",*p);
        p--;
    }
    printf("\n");
    return 0;
}


int main()
{
    int save,save1;
    PSqstack S;
    Sqstack s;
    S = Init_stack(&s);
    Push(S, 10);
    Push(S, 20);
    Push(S, 30);
    Push(S, 40);
    Traverse(S);
    Pop(S,&save);
    GetTop(S,&save1);
    printf("%d\n",save);
    printf("%d\n",save1);
    Traverse(S);
    //DestroyStack(S);
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值