栈的基本操作

来源:互联网 发布:网络连接拓扑图 编辑:程序博客网 时间:2024/05/17 22:41
#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;void init(PSTACK);void push(PSTACK,int); //压栈 void traverse(PSTACK); //遍历bool empty(PSTACK); //判断是否为空 bool pop(PSTACK,int *); //出栈 void clear(PSTACK); //清空 int main(){STACK S;int val;init(&S);printf("接下来请输入一系列数字,输入0的时候终止:\n");scanf("%d",&val);while(val!=0){push(&S,val);scanf("%d",&val);}printf("遍历输出栈:\n");traverse(&S); //开始遍历输出 clear(&S); //清空栈中的元素,不是销毁 if(!pop(&S,&val)){printf("出栈失败\n");}else{printf("出栈成功\n");printf("出栈的元素是:%d\n",val); }printf("再次遍历输出栈:\n");traverse(&S); //遍历 }void init(PSTACK pS) //让栈顶和栈底指向同一块内存空间 {pS->pTop = (PNODE)malloc(sizeof(NODE));if(pS->pTop==NULL){printf("动态内存分配失败\n");exit(-1); //分配失败时自动结束程序 }else{pS->pBottom = pS->pTop;pS->pTop->pNext = NULL;}}void push(PSTACK pS,int val) //压栈 {PNODE pNew = (PNODE)malloc(sizeof(NODE));//开辟内存空间 if(pS->pTop!=NULL){pNew->data = val;pNew->pNext = pS->pTop;pS->pTop = pNew;//将元素压进栈里面 }}void traverse(PSTACK pS) //遍历输出栈 {PNODE p = pS->pTop;while(p!=pS->pBottom){printf("%d ",p->data);//后进先出,类似从箱子里面拿东西 p = p->pNext;}printf("\n");}bool empty(PSTACK pS) //判断是否元素为空 {if(pS->pTop==pS->pBottom)return true; //为空的时候返回true elsereturn false; //不为空返回false }bool pop(PSTACK pS,int * val) //出栈 {if(empty(pS)) return false; //当空时,返回false else{PNODE r = pS->pTop;//从这里开始出栈的操作 * val = r->data;//将栈顶的值取出来 pS->pTop = r->pNext;//栈顶移到下一个元素 free(r); //释放临时定义的结构体指针 r = NULL; return true;}} void clear(PSTACK pS) //执行清空元素功能的函数 {PNODE p = pS->pTop;PNODE q = NULL;while(p!=pS->pBottom) {q = p->pNext; //让q指向p的下一个结点 free(p); //释放p的内存空间 p = q; //让p指向q }pS->pTop = pS->pBottom;//让栈顶和栈底重新指向同一块内存空间 } 

0 0
原创粉丝点击