动态栈的基本操作

来源:互联网 发布:淘宝网商品名称的容量 编辑:程序博客网 时间:2024/05/08 20:12
#include <stdio.h>#include <malloc.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);//入栈 void pop(PSTACk,int *);//出栈 void printStack(PSTACk);//打印栈void clear(PSTACk);//栈清空 bool is_empty(PSTACk);//判断栈是否为空 int main(void){//这时候已经分配了内存空间给S了,只不过是静态分配,而且是垃圾值//接下来要通过动态分配把里面的内容进行初始化 Stack S;int val; init(&S); push(&S);push(&S);push(&S);push(&S);printStack(&S); pop(&S,&val);printf("出栈的元素为:%d\n",val); printStack(&S);clear(&S);printStack(&S); return 0; } //栈初始化void init(PSTACk pS){pS->pTop = (PNODE)malloc( sizeof(NODE) );if(pS->pTop == NULL){printf("内存分配失败\n");exit(-1); }pS->pBottom = pS->pTop;pS->pTop->pNext = NULL; } //判断栈是否为空 bool is_empty(PSTACk pS){if(pS->pTop == pS->pBottom){return true; } return false; }//入栈void push(PSTACk pS){printf("请输入你要入栈的元素值:");int val;scanf("%d",&val);PNODE pNew = (PNODE)malloc( sizeof(NODE) );pNew->data = val; pNew->pNext = pS->pTop;//因为栈是先进后出的,所以整个链表的连接方向要反着 pS->pTop = pNew; }//打印栈元素 void printStack(PSTACk pS){if(is_empty(pS) ){printf("栈为空,不能打印\n");return; } PNODE p = pS->pTop;printf("当前栈元素为:"); while(p != pS->pBottom){printf("%d ",p->data); p = p->pNext; } printf("\n"); }//出栈void pop(PSTACk pS,int * pVal){if(is_empty(pS) ){printf("栈为空,不能出栈\n");return; }PNODE p = pS->pTop;*pVal = p->data; pS->pTop = p->pNext;free(p); } //栈清空void clear(PSTACk pS){if(is_empty(pS) ){printf("栈为空,不能清空\n");return; }PNODE p = NULL;while(pS->pTop != pS->pBottom){p = pS->pTop; pS->pTop = pS->pTop->pNext;free(p); } } 

原创粉丝点击