`
wx1569484809
  • 浏览: 63776 次
文章分类
社区版块
存档分类
最新评论

c语言实现栈

 
阅读更多

闲来无事,简单用c语言实现了栈的功能,最简单的方法是用数组来实现,但是对内存的运用不够灵活,链表访问起来不够灵活,双向链表倒是可以两者兼容,但是空间使用大了点,对于要存放比较复杂的数据类型的比较大的栈,应该比较合适。也可以用指针数组,操作起来就简单许多。

这里,我用最简单的方法来实现,主要用于学习交流.r若代码中有错误或是不合理之处,欢迎指正。

main.c

#include <stdio.h>
#include "cfilo.h"

int main(void) 
{
    int i;
    struct filo_t* myfilo = filo_create(100);
    if ( get_filo_err() < 0 ) {
        return 0;
    }
    printf("myfilo depth %d\n", myfilo->depth);
    for (i = 0;i < 102; i++) {
        myfilo->push(myfilo, i);
    }
    myfilo->print(myfilo);
    for (i = 0;i < 102; i++) {
        printf("myfilo pop %d\n", myfilo->pop(myfilo));
    }
    myfilo->print(myfilo);

    return 0;
}

 

cfilo.h

/**
 * language:        c
 * data structure:    array
 * functionality:    filo
 * author:            jason
**/
#ifndef __CFILO_H__
#define __CFILO_H__

#define MAX_FILO_DEPTH        1024u

extern int filo_err;

struct filo_t {
    unsigned int depth;                //栈的深度
    unsigned int free_size;            //栈的可用空间
    int* pfilo;                        //栈底指针
    int* ftop;                        //栈顶指针

    void (*push)(struct filo_t* p, int num);
    int (*pop)(struct filo_t* p);
    unsigned int (*get_free_size)(struct filo_t* p);
    void(*print)(struct filo_t* p);
};

/**
 * @detail        push a num to filo
 * @arg0        struct filo_t* p: point a filo
 * @arg1        int num: will be push to filo
 * @return        void
**/
void filo_push(struct filo_t* p, int num);

/**
 * @detail        get the top num in filo
 * @arg0        struct filo_t* p: point a filo
 * @return        the filo's top num
**/
int filo_pop(struct filo_t* p);

/**
 * @detail        get free size of filo
 * @arg0        struct filo_t* p: point a filo
 * @return        free size of filo
**/
unsigned int filo_get_free_size(struct filo_t* p);

/**
 * @detail        print all num in filo
 * @arg0        struct filo_t* p: point a filo
 * @return        void
**/
void filo_print(struct filo_t* p);

/**
 * @detail        create a filo
 * @arg0        filo depth you need, not allowed more then MAX_FILO_DEPTH
 * @return        struct filo_t* p: point a filo
**/
struct filo_t *filo_create(unsigned int depth);

/**
* @detail        get filo err code
* @arg            void
* @return        0:succeed, <0:failed
**/
int get_filo_err(void);


#endif

 

cfilo.c

#include <stdio.h>
#include <stdlib.h>
#include "cfilo.h"

int filo_err = 0;

int get_filo_err(void) 
{
    return filo_err;
}

void filo_push(struct filo_t* p, int num)
{
    if (p->free_size == 0) {                // filo is full
        filo_err = -1;
        printf("filo is full!\n");
        return;
    }
    if (p->ftop == NULL) {                    // filo is empty
        p->ftop = p->pfilo;
        *(p->ftop) = num;
        p->free_size--;
        filo_err = 0;
    }
    else {
        p->ftop++;
        *(p->ftop) = num;
        p->free_size--;
        filo_err = 0;
    }
}

int filo_pop(struct filo_t* p) 
{
    if (p->free_size >= p->depth) {                    // filo is empty
        filo_err = -1;
        printf("filo is empty!\n");
        return 0;
    }
    int ret;
    if (p->ftop == p->pfilo) {                        // just one num left in filo
        ret = *(p->ftop);
        p->ftop = NULL;
        p->free_size++;
        filo_err = 0;
    }
    else {
        ret = *(p->ftop);
        p->ftop--;
        p->free_size++;
        filo_err = 0;
    }
    return ret;
}

unsigned int filo_get_free_size(struct filo_t* p)    
{
    filo_err = 0;
    return p->free_size;
}

void filo_print(struct filo_t* p)
{
    if (p->free_size == p->depth) {
        filo_err = -1;
        printf("NULL\n");
        return;
    }
    int i;
    int *pint = p->pfilo;
    printf("<1>: %d\n", *pint);
    for (i = 2; i <= (p->depth - p->free_size); i++) {
        pint++;
        printf("<%d>: %d\n", i, *pint);
    }
    filo_err = 0;
}

struct filo_t *filo_create(unsigned int depth)
{
    if (depth > MAX_FILO_DEPTH) {    
        filo_err = -1;
        printf("the depth out of range!\n");
        return NULL;
    }
    struct filo_t *p = (struct filo_t *)malloc(sizeof(struct filo_t));
    p->depth = depth;
    p->free_size = depth;
    p->ftop = NULL;
    p->pfilo = (int *)malloc(sizeof(int) * depth);

    p->get_free_size = filo_get_free_size;
    p->pop = filo_pop;
    p->push = filo_push;
    p->print = filo_print;

    filo_err = 0;

    return p;
}

转载于:https://my.oschina.net/u/3464640/blog/1506960

分享到:
评论

相关推荐

    C语言实现栈与队列

    本项目是用C语言实现的栈和队列,提供了可加载和使用的源代码,这对于理解这两种数据结构的工作原理以及在C语言中如何实现它们非常有帮助。 首先,让我们详细了解栈和队列的概念: 1. 栈(Stack):栈是一种后进先...

    c语言实现栈的操作实例

    本篇文章将深入探讨如何用C语言实现栈的基本操作,包括栈的初始化、入栈(压栈)、出栈(弹栈)、查看栈顶元素、判断栈是否为空以及查找栈的大小。 首先,我们需要定义一个栈的结构体,通常包含栈顶指针和栈的容量...

    C语言实现栈实现表达式

    C语言实现栈实现表达式,很好用,有需要的请来下载。

    C语言实现栈的操作

    以上就是C语言实现栈的基本操作。在实际应用中,还可以根据需求扩展其他功能,如动态扩容、栈的合并等。记得在使用完栈后释放内存,避免内存泄漏。 ```c void freeStack(Stack* stack) { free(stack-&gt;elements); ...

    C语言实现栈,队列,循环队列

    C语言实现栈,队列,循环队列

    数据结构C语言实现栈和队列的基本操作

    在C语言中实现栈,我们通常会使用动态内存分配创建一个数组,并维护一个指针来追踪栈顶。栈的基本操作包括: 1. 初始化:创建一个新的空栈,通常通过分配一定大小的内存空间并设置栈顶指针为-1或0来完成。 2. 压栈...

    C语言实现栈结构先进后出的功能

    这是一个用C语言实现栈的先进后出特点的程序; 这是一个简短但很实用的程序,尤其对初学者来说容易理解

    1_c语言实现栈操作_

    本文将深入探讨如何使用C语言来实现一个简单的顺序栈,并讲解相关知识点。 顺序栈是一种线性结构,它的元素在内存中是连续存放的,类似于数组。在C语言中,我们可以用数组来模拟栈的结构。下面我们将详细讨论以下几...

    C语言实现栈操作

    假设给定的整数栈 初始状态为空,栈的最大容量为100.从标准输入中输入一组栈操作,按操作顺序输出出栈元素序列。栈操作:1表示入栈操作,后跟一个整数(不为1/0和-1)为入栈元素,0表示出栈操作,-1表示操作结束。从...

    c语言用栈实现计算器功能

    总之,使用C语言和栈数据结构实现计算器功能是一个很好的实践项目,它可以帮助开发者巩固对数据结构、逻辑思维和算法的理解,同时也能提升实际编程能力。在实现过程中,通过不断优化和调试,可以逐步提高代码的效率...

    使用C语言实现栈的源文件

    c语言

    C语言实现栈空间共享代码

    这段代码是用C语言编写的,用于实现一个双栈结构,即在一个数组中存储两个栈,一个从数组头部开始,一个从数组尾部开始,以节省空间。代码的主要功能如下: 定义了一个判断函数judge(),用于检查是否栈满,即是否top...

    使用C语言实现栈的头文件

    c语言

    C语言实现栈与队列_C++

    在C语言中,我们通常通过动态数组或链表来实现栈。`stack.c`可能包含了这些操作的实现,如定义栈结构、初始化、压栈、弹栈等函数。 ```c typedef struct Stack { int* data; int top; int size; } Stack; Stack...

    C语言实现的栈操作(基于数据结构(C语言版))

    在计算机科学中,数据结构是组织、存储和处理数据的方式,而栈是一种基本的数据结构,被称为“后进先出”(LIFO)的数据...通过阅读和分析这些代码,你可以加深对C语言实现栈操作的理解,并学习如何在实际项目中运用。

    基于VC和C语言实现栈的链式创建、增删查改

    里面是链式栈的VC源代码,已经调试过,可以正常执行

    C例子:栈C语言实现

    以上就是C语言实现栈的基本过程。在实际编程中,我们还可以增加错误处理、动态扩容等功能,以提高代码的健壮性和适应性。这个例子为我们提供了一个简单的栈实现,可以作为学习和理解栈数据结构的基础。

    栈实现计算器(C语言实现)

    本篇将详细介绍如何使用C语言实现一个基于栈的计算器。 首先,我们需要理解栈的基本操作:入栈(push)、出栈(pop)、查看栈顶元素(peek)以及检查栈是否为空(isEmpty)。在我们的计算器中,主要会用到两个栈,...

    栈的C语言实现

    在本文中,我们将深入探讨如何用C语言实现栈,以及顺序栈的概念。 首先,我们要理解栈的基本操作。栈通常包含两个主要操作:压入(push)和弹出(pop)。压入操作是在栈顶添加新元素,而弹出操作则是移除栈顶的元素...

Global site tag (gtag.js) - Google Analytics