数据结构:链式栈

 先写头文件:list_Stack.h

#pragma once

typedef int ELEM_TYPE;

//链式栈的结构体声明:  直接用单链表的即可
typedef struct LStack
{
	ELEM_TYPE data;//数据域
	struct LStack* next;//指针域
}LStack, *PLStack;


//链栈可执行函数的声明
//初始化
void Init_LStack(struct LStack* ps);

//入栈(插入)
bool Push(PLStack ps, ELEM_TYPE val);

//出栈(获取删除的栈顶元素值,并且删除) //用到一个输出参数
bool Pop(PLStack ps, ELEM_TYPE *rtval);

//获取栈顶元素(获取栈顶元素值,但是不删除) //用到一个输出参数
bool Top(PLStack ps, ELEM_TYPE *rtval);

//判空
bool IsEmpty(PLStack ps);

//判满
bool IsFull(PLStack ps);

//扩容
void Inc(PLStack ps);

//获取有效长度
int Get_length(PLStack ps);

//清空
void Clear(PLStack ps);

//销毁
void Destroy(PLStack ps);

//打印
void Show(PLStack ps);


再写list_Stack.cpp文件

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include "list_stack.h"
//链栈可执行函数的声明
//初始化
void Init_LStack(struct LStack* ps)
{
	//assert 
	ps->next = NULL;
}
//入栈(头插)
bool Push(PLStack ps, ELEM_TYPE val)
{
	//assert
	//1.购买新节点
	struct LStack* pnewnode = (struct LStack*)malloc(1 * sizeof(struct LStack));
	assert(pnewnode != NULL);
	pnewnode->data = val;
	//2.找到合适的插入位置(头插,不用找,因为头结点就是合适位置)
	//3.进行插入
	pnewnode->next = ps->next;
	ps->next = pnewnode;
	return true;
}
//出栈(获取删除的栈顶元素值,并且删除) //用到一个输出参数
bool Pop(PLStack ps, ELEM_TYPE *rtval)
{
	//assert (ps  rtval)  != NULL
	if(IsEmpty(ps))//确实链栈至少有一个节点
	{
		return false;
	}

	*rtval = ps->next->data;//将一会要出栈的值 通过输出参数rtval带出来

	//申请一个临时指针指向待删除节点,跨越指向,释放待删除节点
	PLStack p = ps->next;
	ps->next = p->next;
	free(p);

	return true;
}
//获取栈顶元素(获取栈顶元素值,但是不删除) //用到一个输出参数
bool Top(PLStack ps, ELEM_TYPE *rtval)
{
	//assert (ps  rtval)  != NULL
	if(IsEmpty(ps))//确实链栈至少有一个节点
	{
		return false;
	}

	*rtval = ps->next->data;//将一会要出栈的值 通过输出参数rtval带出来

	return true;
}
//判空
bool IsEmpty(PLStack ps)
{
	return ps->next == NULL;
}
//不用判满
//获取有效长度
int Get_length(PLStack ps)
{
	int count = 0;

	//只要调用我们之前写的 两个for循环里面的那个 不需要前驱的for循环, 遍历一遍即可
	for(PLStack p = ps->next; p!=NULL; p=p->next)
	{
		count++;
	}

	return count;
}
//清空
void Clear(PLStack ps)
{
	Destroy(ps);
}

//销毁
void Destroy(PLStack ps)
{
	PLStack p = ps->next;
	PLStack q = NULL;

	ps->next = NULL;

	while(p != NULL)
	{
		q = p->next;
		free(p);
		p = q;
	}
}

//打印
void Show(PLStack ps)
{
	for(PLStack p = ps->next; p!=NULL; p=p->next)
	{
		printf("%d ", p->data);
	}
	printf("\n");
}

最后在主函数中运行

#include <stdio.h>
#include "assert.h"
#include <stdlib.h>
#include <vld.h>
#include "list_Stack.H"

//链栈的测试用例
int main()
{
	LStack head;
	Init_LStack(&head);

	for(int i=0; i<20; i++)//20 19 18.....3 2 1
	{
		Push(&head, i+1);
	}
	Show(&head);
	printf("length = %d\n", Get_length(&head));

	ELEM_TYPE tmp;
	bool tag1 = Pop(&head, &tmp);
	if(tag1)
	{
		printf("pop = %d\n", tmp);
	}
	Show(&head);
	printf("length = %d\n", Get_length(&head));

	ELEM_TYPE flg;
	bool tag2 = Top(&head, &flg);
	if(tag2)
	{
		printf("top = %d\n", flg);
	}
	Show(&head);
	printf("length = %d\n", Get_length(&head));
	Destroy(&head);
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值