带头结点的链式栈代码
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--;
}