带头结点的链式栈代码

带头结点的链式栈代码

main.c文件代码

#include"stack.h"
int main()
{
	struct stack * head = InitStack();//初始化
	int data;//输入的数据
	printf("请输入数据,输入-1结束\n");
	while(1)
	{
		scanf("%d",&data);
		if(data == -1)
		{
			break;
		}
		Push(head,data);//入栈
	}
	GetTop(head);//求栈顶元素
	DestroyStack(head);//销毁栈
	return 0;
}

stack.h文件代码

#ifndef __STACK_H__
#define __STACK_H__

#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
struct node
{
	int data;
	struct node * next;
};
struct stack
{
	int num;
	struct node * top;
	struct node * bottom;
};
//InitStack 初始化一个栈
struct stack * InitStack();
//DestroyStack 销毁一个栈
void DestroyStack(struct stack * head);
//ClearStack 清空一个栈
void ClearStack(struct stack * head);
//CheckStackEmpty 检查一个栈是否为空
bool CheckStackEmpty(struct stack * head);
//GetTop 获取栈顶的元素 但是不会出栈
void GetTop(struct stack * head);
//Push 入栈	
void Push(struct stack * head,int data);
//Pop 出栈
void Pop(struct stack * head);
#endif

stack.c文件代码

#include"stack.h"

//InitStack 初始化一个栈
struct stack * InitStack()
{
	struct stack * head = malloc(sizeof(*head));
	head -> num = 0;
	head -> top = head -> bottom = NULL;
	return head;
}
//DestroyStack 销毁一个栈
void DestroyStack(struct stack * head)
{
	if(!head)
	{
		printf("栈没有初始化\n");
		return;
	}
	if(CheckStackEmpty(head))
	{
		free(head);
		printf("空栈,不用销毁\n");
		return;
	}
	printf("开始销毁\n");
	ClearStack(head);
	printf("结束销毁\n");
	printf("栈内还有%d个元素\n",head -> num);
	free(head);
}
//ClearStack 清空一个栈
void ClearStack(struct stack * head)
{
	if(!head)
	{
		printf("栈没有初始化\n");
		return;
	}
	while(!CheckStackEmpty(head))
	{
		Pop(head);	
	}
}
//CheckStackEmpty 检查一个栈是否为空
bool CheckStackEmpty(struct stack * head)
{
	if(!head)
	{
		printf("栈没有初始化\n");
		return true;
	}
	if(head -> num == 0)
	{
		return true;
	}
	return false;
}
//GetTop 获取栈顶的元素 但是不会出栈
void GetTop(struct stack * head)
{
	if(!head)
	{
		printf("栈没有初始化\n");
		return;
	}
	if(CheckStackEmpty(head))
	{
		printf("空栈,获取栈顶的元素失败\n");
		return;
	}
	printf("栈顶元素为:%d\n",head -> top -> data);
}
//Push 入栈	
void Push(struct stack * head,int data)
{
	if(!head)
	{
		printf("栈没有初始化\n");
		return;
	}	
	struct node * pnew = malloc(sizeof(*pnew));
	pnew -> data = data;
	pnew -> next = NULL;
	if(head -> num == 0)//空栈
	{
		head -> top = pnew;
		head ->num++;
		return;
	}
	pnew -> next = head -> top;
	head -> top = pnew;
	head -> num++;
}
//Pop 出栈
void Pop(struct stack * head)
{
	if(!head)
	{
		printf("栈没有初始化\n");
		return;
	}	
	if(head -> num == 0)
	{
		printf("栈已经空了\n");
		return;
	}
	printf("%d\n",head -> top -> data);
	struct node * p = head -> top;
	head -> top = head -> top -> next;
	p -> next = NULL;
	free(p);
	head -> num--;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值