【数据结构】栈学习之数组实现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;
}

相关文章

【啊哈!算法】算法3:最常用的排序——快速排序       ...
匿名组 这里可能用到几个不同的分组构造。通过括号内围绕的正...
选择排序:从数组的起始位置处开始,把第一个元素与数组中其...
public struct Pqitem { public int priority; ...
在编写正则表达式的时候,经常会向要向正则表达式添加数量型...
来自:http://blog.csdn.net/morewindows/article/details/6...