欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

线性表之数组实现栈结构

程序员文章站 2024-03-23 20:09:40
...

用数组实现栈结构

实现

栈结构的数组实现是用一个一维数组存放数据,数据每次从队尾加入,删除时也从队尾删除,要实现这种增删操作需要使用一个记录下标的指针(top)来指向栈顶。当添加元素时添加到 arr[top+1]位置,当要做删除操作时 使top–;指向倒数第二个元素,使其称为新栈顶。旧栈顶则被忽略,当其所占空间要使用时直接覆盖即可。

栈与递归

栈是一种很常用的结构,比如函数调用就使用栈结构,当程序执行到函数调语句时先把当前函数保存在栈中,即压栈。然后进入函数调用执行。当再次碰到函数调用语句时则重复上述步骤。当一个函数调用A执行完后,再把调用A的函数从栈中取出,继续执行这条函数。如此重复,直到main函数执行结束。下面是递归演示

void recursionDemo(array *arr,int count){

    //判断栈是否满,如果已满则不在继续执行。这是递归结束的条件
    if( !(arr->top < arr->length-1) ){
        return ;
    }

    push(arr,count);
    printf(" %d 元素进栈\n",count);

    //调用自身
    recursionDemo(arr,++count);

    //打印后 出栈
    printf(" %d 元素出栈\n",*getTop(arr));
    pop(arr);

  打印结果
 1 元素进栈      
 2 元素进栈
 3 元素进栈
 4 元素进栈
 5 元素进栈
 5 元素出栈
 4 元素出栈
 3 元素出栈
 2 元素出栈
 1 元素出栈
请按任意键继续. . .

}

线性表之数组实现栈结构
递归常用于分治法解决问题,每一次递归都使问题规模更小,直到问题规模最小(不可拆分)时结束递归。

完整demo代码如下:

#define SIZE 6 

//定义栈结构
typedef struct array{
    int data[SIZE];
    int length;
    int top;
}array;

//初始化
array *newArr(){
    array *arr = (array *)malloc(sizeof(array));

    //0下标空闲,不使用
    arr->top = 0;
    arr->length = SIZE;
}

//判栈空
int isEmpty(array *arr){
    return arr->top ==  0;
}

//出栈
void pop(array *arr){
    if(isEmpty(arr)){
        printf("the stack is null");
        return;
    }
    arr->top--;
}

//返回栈顶元素的指针
int *getTop(array *arr){

    return isEmpty(arr)? NULL:&arr->data[arr->top];
}

//入栈
void push(array *arr,int value){
    if(arr->top< arr->length-1){
        arr->data[++(arr->top)] = value;
    }
}

//test
void ASTest(){
    array *arr = newArr();
    push(arr,1);
    push(arr,2);
    push(arr,3);
    push(arr,4);
    push(arr,5);

    while(!isEmpty(arr)){
        printf("value = %d top = %d\n",*getTop(arr),arr->top);
        pop(arr);
    }
    //现在是空栈了
    printf("\n递归演示\n");
    //栈的递归演示
    recursionDemo(arr,1);
}
void recursionDemo(array *arr,int count){

    //判断栈是否满,如果已满则不在继续执行。这是递归结束的条件
    if( !(arr->top < arr->length-1) ){
        return ;
    }

    push(arr,count);
    printf(" %d 元素进栈\n",count);

    //调用自身
    recursionDemo(arr,++count);

    //打印后 出栈
    printf(" %d 元素出栈\n",*getTop(arr));
    pop(arr);

}

/*
运行结果:

value = 5 top = 5
value = 4 top = 4
value = 3 top = 3
value = 2 top = 2
value = 1 top = 1

递归演示
 1 元素进栈
 2 元素进栈
 3 元素进栈
 4 元素进栈
 5 元素进栈
 5 元素出栈
 4 元素出栈
 3 元素出栈
 2 元素出栈
 1 元素出栈
请按任意键继续. . .
*/