自学内容网 自学内容网

C语言-栈的实现

stack.h

#ifndef STACK_H
#define STACK_H
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>


#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");
}


原文地址:https://blog.csdn.net/weixin_74368090/article/details/140503112

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!