带头结点的链式栈代码

带头结点的链式栈代码

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
    评论
完整的链代码如下所示: ``` #include <stdio.h> #include <stdlib.h> #include <stdbool.h> // 定义链节点构体 typedef struct StackNode { int data; // 数据域 struct StackNode* next; // 指向下一个节点的指针 }StackNode; // 定义链构体 typedef struct LinkStack { StackNode* top; // 指向顶节点的指针 int size; // 的大小 }LinkStack; // 入操作 void Push(LinkStack* stack, int data) { StackNode* node = (StackNode*)malloc(sizeof(StackNode)); node->data = data; node->next = stack->top; stack->top = node; stack->size++; } // 出操作 int Pop(LinkStack* stack) { if (stack->size == 0) return -1; // 为空,返回-1表示出错 StackNode* node = stack->top; int data = node->data; stack->top = stack->top->next; free(node); stack->size--; return data; } // 取顶元素 int Top(LinkStack* stack) { if (stack->size == 0) return -1; // 为空,返回-1表示出错 return stack->top->data; } // 判断是否为空 bool IsEmpty(LinkStack* stack) { return stack->size == 0; } // 主函数 int main() { LinkStack stack; // 定义链 stack.top = NULL; // 初始化顶指针 stack.size = 0; // 初始化的大小为0 // 测试入操作 Push(&stack, 1); Push(&stack, 2); Push(&stack, 3); // 测试出操作 int data = Pop(&stack); if (data != -1) printf("出元素为:%d\n", data); // 测试取顶元素 int top_data = Top(&stack); if (top_data != -1) printf("顶元素为:%d\n", top_data); // 测试判断是否为空 bool is_empty = IsEmpty(&stack); if (is_empty) printf("为空\n"); else printf("不为空,大小为:%d\n", stack.size); return 0; } ``` 上面的代码实现了链的基本操作,包括入、出、取顶元素和判断是否为空。可以根据需要进行修改和扩展。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值