闲来无事,简单用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;
}
相关推荐
本项目是用C语言实现的栈和队列,提供了可加载和使用的源代码,这对于理解这两种数据结构的工作原理以及在C语言中如何实现它们非常有帮助。 首先,让我们详细了解栈和队列的概念: 1. 栈(Stack):栈是一种后进先...
本篇文章将深入探讨如何用C语言实现栈的基本操作,包括栈的初始化、入栈(压栈)、出栈(弹栈)、查看栈顶元素、判断栈是否为空以及查找栈的大小。 首先,我们需要定义一个栈的结构体,通常包含栈顶指针和栈的容量...
C语言实现栈实现表达式,很好用,有需要的请来下载。
以上就是C语言实现栈的基本操作。在实际应用中,还可以根据需求扩展其他功能,如动态扩容、栈的合并等。记得在使用完栈后释放内存,避免内存泄漏。 ```c void freeStack(Stack* stack) { free(stack->elements); ...
C语言实现栈,队列,循环队列
在C语言中实现栈,我们通常会使用动态内存分配创建一个数组,并维护一个指针来追踪栈顶。栈的基本操作包括: 1. 初始化:创建一个新的空栈,通常通过分配一定大小的内存空间并设置栈顶指针为-1或0来完成。 2. 压栈...
这是一个用C语言实现栈的先进后出特点的程序; 这是一个简短但很实用的程序,尤其对初学者来说容易理解
本文将深入探讨如何使用C语言来实现一个简单的顺序栈,并讲解相关知识点。 顺序栈是一种线性结构,它的元素在内存中是连续存放的,类似于数组。在C语言中,我们可以用数组来模拟栈的结构。下面我们将详细讨论以下几...
假设给定的整数栈 初始状态为空,栈的最大容量为100.从标准输入中输入一组栈操作,按操作顺序输出出栈元素序列。栈操作:1表示入栈操作,后跟一个整数(不为1/0和-1)为入栈元素,0表示出栈操作,-1表示操作结束。从...
总之,使用C语言和栈数据结构实现计算器功能是一个很好的实践项目,它可以帮助开发者巩固对数据结构、逻辑思维和算法的理解,同时也能提升实际编程能力。在实现过程中,通过不断优化和调试,可以逐步提高代码的效率...
c语言
这段代码是用C语言编写的,用于实现一个双栈结构,即在一个数组中存储两个栈,一个从数组头部开始,一个从数组尾部开始,以节省空间。代码的主要功能如下: 定义了一个判断函数judge(),用于检查是否栈满,即是否top...
c语言
在C语言中,我们通常通过动态数组或链表来实现栈。`stack.c`可能包含了这些操作的实现,如定义栈结构、初始化、压栈、弹栈等函数。 ```c typedef struct Stack { int* data; int top; int size; } Stack; Stack...
在计算机科学中,数据结构是组织、存储和处理数据的方式,而栈是一种基本的数据结构,被称为“后进先出”(LIFO)的数据...通过阅读和分析这些代码,你可以加深对C语言实现栈操作的理解,并学习如何在实际项目中运用。
里面是链式栈的VC源代码,已经调试过,可以正常执行
以上就是C语言实现栈的基本过程。在实际编程中,我们还可以增加错误处理、动态扩容等功能,以提高代码的健壮性和适应性。这个例子为我们提供了一个简单的栈实现,可以作为学习和理解栈数据结构的基础。
本篇将详细介绍如何使用C语言实现一个基于栈的计算器。 首先,我们需要理解栈的基本操作:入栈(push)、出栈(pop)、查看栈顶元素(peek)以及检查栈是否为空(isEmpty)。在我们的计算器中,主要会用到两个栈,...
在本文中,我们将深入探讨如何用C语言实现栈,以及顺序栈的概念。 首先,我们要理解栈的基本操作。栈通常包含两个主要操作:压入(push)和弹出(pop)。压入操作是在栈顶添加新元素,而弹出操作则是移除栈顶的元素...