🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
# 说明 为了能在嵌入式上使用栈,根据自己的使用习惯设计了实现栈的代码。 # 文件结构 ``` . ├── HStack.c ├── HStack.h ├── main.cpp └── run.sh 执行脚本 ``` # HStack.c ```c #include "HStack.h" #include<stdlib.h> STACK_t *mthis ; STACK_t * GetStack(STACK_t * s) { mthis = s; return mthis ; } /******************************************** * 数据入栈操作 * 参数1:入队数据 * 返回值:操作成功返回 0 ,否则返回 正数 ********************************************/ int HSTACK_Push(int data){ if(mthis->top >= mthis->len-1) return 1; mthis->top++; mthis->buf[mthis->top] = data ; mthis->full = (mthis->top >= mthis->len-1) ? 1 : 0; mthis->empty = 0 ; return 0; } /******************************************** * Pop * 数据出栈操作 * 返回值:出栈的数据 ********************************************/ int HSTACK_Pop(void){ int rt =0; if(mthis->top <0) return 0; rt = mthis->buf[mthis->top]; mthis->top--; mthis->full = 0; mthis->empty = (mthis->top < 0) ? 1 : 0 ; return rt ; } void HSTACK_Clean() { free(mthis->buf) ; } /******************************************** * mthisinit * 初始化 栈 * 参数1: STACK_t 对象 * 参数2:数据缓存buf * 返回值:操作成功返回 0 ,否则返回 正数 ********************************************/ int HSTACK_Init(STACK_t *q, int bufSize){ if( bufSize <= 0) return 1; q->buf = (int *)malloc((bufSize+1)*sizeof(int)); q->top = -1 ; q->len = bufSize; q->full = 0; q->empty = 1; q->Push = HSTACK_Push; q->Pop = HSTACK_Pop ; q->Clean = HSTACK_Clean; return 0; } ``` # HStack.h ```C #ifndef _SRC_HSTACK_H_ #define _SRC_HSTACK_H_ typedef float Dtype; //自定义amini的数据类型 typedef struct _STACK_t_{ int len ; int *buf ; int top ; char empty; char full; int (*Push)(int); int (*Pop)(); void (*Clean)(void) ; } STACK_t; int HSTACK_Init(STACK_t *q, int bufSize) ; STACK_t * GetStack(STACK_t * fifo) ; #endif ``` # main.cpp ```c #include "iostream" #include "HStack.h" using namespace std ; int main() { STACK_t s ; HSTACK_Init(&s,10); int i =0; for(i=0 ; i < s.len+2;i++) { // 写数据 if(!s.full)GetStack(&s) ->Push(i); } i = 20; cout << " --------" << endl; while(!s.empty) { cout<< GetStack(&s) ->Pop()<<endl ; if (i<=0) break; i--; } cout << "----------------" <<endl ; GetStack(&s)->Push(12); GetStack(&s)->Push(15); cout << GetStack(&s)->Pop() << endl ; GetStack(&s)->Push(13); cout << GetStack(&s)->Pop() << endl ; cout << GetStack(&s)->Pop() << endl ; GetStack(&s)->Clean(); //释放指针 } ``` # run.sh ```bash #!/usr/bin/env bash cd $(dirname $0) main() { echo comp } #------------------------- # 编译并运行 #------------------------- function comp() { local src=$(find -type f -regex ".*\.\(c\|cpp\)") local lstr="" for i in $src do g++ -std=c++11 -c $i if [[ $i == *".cpp" ]] ; then lstr="$lstr $(basename $i .cpp).o" elif [[ $i == *".c" ]] ; then lstr="$lstr $(basename $i .c).o" fi done # echo $lstr local sys=$(CheckSys) g++ -std=c++11 $lstr -o mexe if [[ $sys == "cygwin" ]] ; then echo "Platform: cygwin" mv mexe.exe debug/mexe.exe chmod +x debug/mexe.exe ./debug/mexe.exe rm -f *.o return 0 fi if [[ $sys == "linux" ]] ; then echo "Platform: linux" mv mexe debug/mexe chmod +x debug/mexe ./debug/mexe rm -f *.o return 0 fi } #---------------------- #系统检测 #---------------------- function CheckSys() { local sys=$(uname -s | tr '[A-Z]' '[a-z]') case $sys in *cygwin*) echo "cygwin" ;; *linux*) echo "linux" ;; *) echo "unknow" ;; esac } main $* ``` ``