一种可以实现“先进后出”的存储结构
分类:静态栈(数组实现)、动态栈(链表实现);
算法:- 进栈
- 出栈
- 函数调用(函数的地址和参数信息作为个体压入栈)
- 中断
- 生产者与消费者例子;生产者实现进栈、消费者实现出栈。
- 表达式求值(两个栈实现,一个为存数据的栈,一个为存预算符的栈)
- 走迷宫
#include#include #include //函数(包括主函数)静态、局部变量内存是在栈内分配的(操作系统来实现分配);动态内存分配是在堆内分配(malloc) ,动态内存分配需要程序员手动分配 typedef struct Node{ int data; struct Node * pNext; } NODE,* PNODE; typedef struct Stack{ PNODE pTOP; PNODE pBottom; }STACK,* PSTACK; //函数声明 void Init(PSTACK Sp); //生成有效栈,并且初始化 void Push(PSTACK Sp,int val); //入栈 void Traveres_stack(PSTACK Sp); //遍历栈 bool Pop(PSTACK Sp, int * p_dVal);//出栈 bool Clear_stack(PSTACK Sp); bool Destroy(PSTACK Sp); //主函数 int main(int argc, char** argv) { STACK S; //STACK等价于struct Stack,备注此时并未S真正表示有效栈,需要初始化处理 Init(&S); Push(&S,1); Push(&S,2); Push(&S,3); Traveres_stack(&S); Clear_stack(&S); Traveres_stack(&S); return 0; } //辅助函数 void Init(PSTACK Sp){ PNODE p=(PNODE)malloc(sizeof(NODE)); if(p == NULL){ printf("堆内存分配失败n") ; exit; } p->pNext=NULL; Sp->pBottom = p; Sp->pTOP = p; } void Push(PSTACK Sp,int val){ PNODE p = (PNODE)malloc(sizeof(NODE)); if(p == NULL){ printf("堆内存分配失败n") ; exit; } p->data= val; p->pNext= Sp->pTOP; Sp->pTOP = p; } void Traveres_stack(PSTACK Sp){ PNODE tp = Sp->pTOP; printf("遍历栈:"); while(tp!=Sp->pBottom){ printf("%d,",tp->data); tp=tp->pNext; } printf("n"); } bool Is_empty(PSTACK Sp){ if(Sp->pBottom == Sp->pTOP) return true; else return false; } //把Sp栈出栈一次,并把出栈元素 保存在dVal中,如果出栈为空,返回false; bool Pop(PSTACK Sp, int * p_dVal){ if(Is_empty(Sp)){ printf("栈为空!n"); return false; }else{ PNODE tmp=Sp->pTOP; Sp->pTOP=Sp->pTOP->pNext; *p_dVal=tmp->data; free(tmp); return true; } } bool Clear_stack(PSTACK Sp){ PNODE tmp = NULL; while(Sp->pTOP!=Sp->pBottom){ tmp=Sp->pTOP; Sp->pTOP=Sp->pTOP->pNext; free(tmp); } } bool Destroy(PSTACK Sp){ Clear_stack(Sp); free(Sp->pTOP); Sp->pBottom=NULL; Sp->pTOP=NULL; return true; }



