C语言-栈的实现
stack.h
#ifndef STACK_H #define STACK_H #include #include #include #define data_t uint32_t typedef struct Node{ data_t data; struct Node* next; }Node; typedef struct stack{ Node* top; uint32_t count; }link_stack; link_stack* init_link_stack(); Node* init_node(); link_stack* push_stack(link_stack* p,data_t data); _Bool isEmpty(link_stack* p); void disp_stack(link_stack* p); link_stack* pop_stack(link_stack *p); void clear_stack(link_stack* p); #endif
stack.c
#include "stack.h" // 初始化栈 link_stack* init_link_stack(){ link_stack *p=calloc(1,sizeof(link_stack)); if(p==NULL){ printf("初始化栈失败!\n"); exit(0); } return p; } // 初始化结点 Node* init_node(){ Node* p=calloc(1,sizeof(Node)); if(p==NULL){ printf("初始化结点失败!\n"); exit(0); } return p; } //入栈push link_stack* push_stack(link_stack* p,data_t data){ if(isEmpty(p)){ return NULL; } Node* temp=init_node(); temp->data=data; temp->next=p->top; p->top=temp; p->count++; return p; } // 出栈pop link_stack* pop_stack(link_stack* p){ if(isEmpty(p)){ return NULL; } if(p->count==0){ return NULL; } Node* temp=p->top; p->top=p->top->next; p->count--; free(temp); temp==NULL; return p; } // 遍历 void disp_stack(link_stack *p){ if(isEmpty(p)){ return; } if(p->count==0){ printf("栈为空!\n"); return ; } Node* temp=p->top; printf("```````````\n"); while(temp!=NULL){ printf("%d\n",temp->data); temp=temp->next; } printf("```````````\n"); } void clear_stack(link_stack* p){ if(isEmpty(p)){ return; } Node* temp=p->top; while(temp!=NULL){ Node* node=temp; temp=temp->next; free(node); node=NULL; } free(p); p=NULL; } // 判断栈是否为空 _Bool isEmpty(link_stack* p){ if(p==NULL){ return 1; } return 0; }
main.c
#include "stack.h" void select_menu(); void menu(); link_stack* p; link_stack* temp; int judge=1; void main(){ while(judge){ menu(); select_menu(); } } void select_menu(){ printf("请选择:"); int select=0; scanf("%d",&select); switch(select){ case 0: judge=0; clear_stack(p); break; case 1: p=init_link_stack(); if(p!=NULL){ printf("初始化成功!\n"); } break; case 2: if(isEmpty(p)){ printf("请先初始化!\n"); }else{ data_t data=0; printf("data="); scanf("%d",&data); temp=push_stack(p,data); if(temp!=NULL){ printf("添加成功! \n"); disp_stack(p); } } break; case 3: if(isEmpty(p)){ printf("请先初始化!\n"); }else{ if(pop_stack(p)==NULL){ printf("栈内无元素!\n"); }else{ printf("pop成功!\n"); disp_stack(p); } } break; case 4: disp_stack(p); break; default: printf("输入错误!"); } } void menu(){ printf("--------------\n"); printf("0:退出\n"); printf("1:初始化stack\n"); printf("2:push\n"); printf("3:pop \n"); printf("4:遍历\n"); printf("--------------\n"); }
(图片来源网络,侵删)
文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。