C语言-栈的实现

stack.h

cpp 复制代码
#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

cpp 复制代码
#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

cpp 复制代码
#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");
}
相关推荐
白帽攻防录3 小时前
SRC 挖洞:PostScript 打印机驱动双 RCE,打印服务器怎么变成内网跳板
开发语言·网络安全·php·内网安全
十年Java程序媛3 小时前
Java枚举Enum完整教程|替代静态常量,开发与面试要点
java·开发语言·spring boot·后端·面试
2603_965148113 小时前
电商选品调研:通过关键词搜索API获取市场热销商品,结合商品详情API分析竞品卖点与定价
开发语言·数据库·人工智能·python·信息可视化
xixiaoyunya4 小时前
Python 异步编程入门:用 asyncio 轻松实现并发任务
开发语言·python·php
学逆向的4 小时前
C 循环结构的执行效率分析
c语言·开发语言·数据结构·网络安全
小坏讲微服务5 小时前
刚发布一个月的JDK 27,为什么我建议你立刻升级?
java·开发语言·spring boot·spring·架构·求职招聘·springboot4
打工仔折腾 AI6 小时前
用 Dashlet 把极空间 NAS 服务入口整理成统一导航首页的实践
java·开发语言·人工智能·后端·python·rpc·ai agent 实战
MATLAB代码顾问6 小时前
Simulink PI 参数扫描与批量仿真完整 MATLAB 代码
开发语言·matlab
Want5957 小时前
Python跳动的爱心②
开发语言·python·数学建模
Navigator_Z7 小时前
LeetCode //C - 1293. Shortest Path in a Grid with Obstacles Elimination
c语言·算法·leetcode