栈
/* 栈: 1、什么叫栈:栈就是一个存储结构,简单的说就是一种存储的方式 2、栈是怎么存储的:栈是先进后出的一种存储结构,类似于箱子 3、栈的分类:静态栈、动态栈。 4、什么叫静态栈:类似于数组往箱子里放 5、什么叫动态栈:类似于链表往箱子里放 6、栈的应用有哪些:迷宫,表达式的计算,函数的调用,中断等,应用相当的广泛 7、栈的操作步骤:初始化,压栈,出栈 注:栈是静态内存存储,比如说,定义的变量,这是系统自动分配的。堆是动态存储结构,是程序员分配的 比如说malloc(sizeof(4)) */ #include<stdio.h> #include<malloc.h> #include<stdlib.h> typedef struct node { int data; struct node * pNext; }Node,*pNode; typedef struct stack { pNode pTop; pNode pBottom; }Stack,* pStack; typedef int bool; #define true 0 #define false 1 void init_stack(pStack); bool is_empty(pStack); bool push_stack(pStack, int); bool pop_stack(pStack, int *); bool clear_stack(pStack); int main(void) { Stack S; int val; init_stack(&S); puts("------------------------------初始化栈是否为空-------------------------------"); if( is_empty(&S) ) printf("栈不为空!\n"); else printf("栈为空!\n"); push_stack(&S, 23); push_stack(&S, 45); push_stack(&S, 19); puts("-------------------------------压栈之后是否为空------------------------------"); if( is_empty(&S) ) printf("栈不为空!\n"); else printf("栈为空!\n"); puts("-------------------------------压栈是否成功----------------------------------"); if( push_stack(&S, 55) ) printf("压栈失败!\n"); else printf("压栈成功!\n"); if( !pop_stack(&S, &val) ) printf("出栈成功:"); pop_stack(&S,&val); puts("---------------------------------把栈清空-----------------------------------"); if( !clear_stack(&S) ) puts("清栈成功!"); pop_stack(&S,&val); return 0; } void init_stack(pStack pS) { pNode pNew=(pNode)malloc(sizeof(Node)); if(pNew==NULL) { printf("动态内存分配失败!"); exit(-1); } pS->pTop=pNew; pS->pBottom=pS->pTop; pS->pBottom->pNext=NULL; //等价于 pNew->pNext=NULL return; } bool is_empty(pStack pS) { if(pS->pTop==pS->pBottom) return true; else return false; } bool push_stack(pStack pS, int val) { pNode pNew=(pNode)malloc(sizeof(Node)); if(pNew==NULL) { printf("动态内存分配失败!"); exit(-1); } pNew->data=val; pNew->pNext=pS->pTop; pS->pTop=pNew; if(pS->pTop==pS->pBottom) return false; else return true; } bool pop_stack(pStack pS, int * pVal) { pNode p=NULL; while( is_empty(pS) ) { p=pS->pTop; *pVal=p->data; printf("%d\t",*pVal); pS->pTop=p->pNext; free(p); } putchar('\n'); if( is_empty(pS) ) return false; else return true; } bool clear_stack(pStack pS) { while( pS->pTop != pS->pBottom ) { pNode p=pS->pTop; pNode q=p->pNext; free(p); pS->pTop=q; } if(pS->pTop==pS->pBottom) return true; else return false; }