栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

堆栈——C语言(动态数组)

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

堆栈——C语言(动态数组)

首先请大家预知,在C语言中,一个数组的数组名是一个指针常量,它指向数组第一个元素,比如

#include
int main()
{
    int a[3] = {1, 2, 3};
    printf("a数组第1个元素:%dn",*a);
    printf("a数组第2个元素:%dn",*(a + 1));
    printf("a数组第3个元素:%dn",*(a + 2));
    return 0;
}

控制台输出:

a数组第1个元素:1
a数组第2个元素:2
a数组第3个元素:3

当然平常访问数组值都是通过下标索引,但是请记住,在C语言中,下标索引访问等同于指针间接访问操作。

a[0] == *(a + 0)
a[2] == *(a + 2)
1.首先定义一个堆栈的接口(stack.h)
#include 

#define STACK_TYPE int 


void push(STACK_TYPE value);


STACK_TYPE pop(void);


STACK_TYPE top(void);


int is_empty(void);


int is_full(void);


int len(void);




void create_stack(size_t size);


void destroy_stack(void);
2.在另一个文件(d_stack.c)中,实现具体函数操作
#include "stack.h"
#include 
#include 
#include 
#include 

static STACK_TYPE *stack;
static size_t stack_size;
static int top_element = -1; 


void create_stack(size_t size){
    assert( stack_size == 0 );
    stack_size = size;
    stack = malloc( stack_size * sizeof( STACK_TYPE ) );
    assert( stack != NULL );
}


void destroy_stack(void){
    assert( stack_size > 0 );
    stack_size = 0;
    free(stack);
    stack = NULL;
}


void push(STACK_TYPE value){
    assert( !is_full() );
    top_element += 1;
    stack[top_element] = value;
}


STACK_TYPE pop(void){
    assert( !is_empty() );
    return stack[top_element--];
}


STACK_TYPE top(void){
    assert( !is_empty() );
    return stack[top_element];
}


int is_empty(void){
    return top_element == -1;
}


int is_full(void){
    return top_element == stack_size - 1;
}


int len(void){
    if(is_empty()){
        return 0;
    }
    else{
        return top_element + 1;
    }
}
3.最后写一个主函数文件(d_main.c)测试一下堆栈操作
#include "d_stack.c"

#define T "True"
#define F "False"

int main(){
    create_stack(10);
    push(6);
    push(3);
    push(2);
    push(4);
    push(5);
    printf("栈顶元素为:%dn",top());
    printf("堆栈为空吗?%sn",is_empty()?T:F);
    printf("堆栈为满吗?%sn",is_full()?T:F);
    printf("堆栈现在存储了%d个值n",len());
    printf("堆栈弹出了%dn",pop());
    printf("堆栈现在存储了%d个值",len());
    destroy_stack();
    return 0;
}

控制台输出为:

栈顶元素为:5
堆栈为空吗?False
堆栈为满吗?False
堆栈现在存储了5个值
堆栈弹出了5
堆栈现在存储了4个值

总结:动态数组实现堆栈比静态数组明显更具优势,可以指定大小,但还有一种操作,没错,就是C语言的特色——链表,接下来,我将运用结构体与指针,实现一个链表节点数据类型,再用这个链表实现堆栈操作。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/856303.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号