栈的链式存储结构

栈的链式存储结构直接会用到线性表的链式存储结构的代码:

LinkListApi.h和LinkListApi.cpp具体参考我之前的文章 线性表的链式存储(业务结点和链表算法分离模式)

这里直接上代码:

linkstack.h如下:

#ifndef _MY_LINKSTACK_H_
#define _MY_LINKSTACK_H_

typedef void LinkStack;
typedef void LinkStackNode;

LinkStack* LinkStack_Create();

void LinkStack_Destroy(LinkStack* stack);

void LinkStack_Clear(LinkStack* stack);

//下面三个需要单独处理
//start
//在最前一个位置插入 与顺序存储不同,链式存储以第一个结点模拟栈顶
int LinkStack_Push(LinkStack* stack, void* item);
//在最前一个位置删除
void* LinkStack_Pop(LinkStack* stack);
//获取最前一个位置元素
void* LinkStack_Top(LinkStack* stack);
//end


int LinkStack_Size(LinkStack* stack);

#endif //_MY_LINKSTACK_H_

linkstack.cpp 代码如下:

#include<iostream>
#include"linkstack.h"
//需要用到线性表的链式存储代码
#include"LinkListApi.h"
struct linkstack
{
	LinkListNode Node;
	void * item;
};

LinkStack* LinkStack_Create()
{
	return LinkList_Create();
}
void LinkStack_Destroy(LinkStack* stack)
{
	LinkStack_Clear(stack);
	LinkList_Destroy(stack);
}
void LinkStack_Clear(LinkStack* stack)
{
	while (LinkList_Length(stack) > 0)
	{
		LinkStack_Pop(stack);
	}
	LinkList_Clear(stack);
	return;
}
int LinkStack_Size(LinkStack* stack)
{
	return LinkList_Length(stack);
}

//开始有点变化了
int LinkStack_Push(LinkStack* stack, void* item)
{
	//我们是在使用线性表的链式存储的api,所以我们要封装一个api接口
	 void* item 栈结点  ===>链表结点
	linkstack *tmp = (linkstack *)malloc(sizeof(linkstack));
	tmp->item = item;
	//向最后一个位置插入个元素
	int ret=LinkList_Insert(stack, (LinkListNode*)tmp,0);
	if (ret != 0)//对于处理失败,要做负责的人进行释放内存空间
	{
		free(tmp);
		return ret;
	}
	return ret;
}
void* LinkStack_Pop(LinkStack* stack)
{
	linkstack *tmp = (linkstack *)LinkList_Delete(stack, 0);
	if (tmp == NULL)
	{
		printf("err:LinkStack_Pop\n");
		return NULL;
	}
	//把链表节点 ====>转换成  栈结点
	void *p = tmp->item;
	free(tmp);
	return p;
}

void* LinkStack_Top(LinkStack* stack)
{
	linkstack *tmp = (linkstack *)LinkList_Get(stack,0);
	if (tmp == NULL)
	{
		printf("err:LinkStack_Pop\n");
		return NULL;
	}
	return tmp->item;
}

测试代码框架如下:

#include "linkstack.h"
#include<iostream>

//自己定义业务结点
typedef struct tag_Student
{
	char name[30];
	int age;
}Student;
int main(int argc, char*argv[])
{
	Student s1;
	Student s2;
	Student s3;
	s1.age = 11;
	s2.age = 12;
	s3.age = 13;
	LinkStack *handle = LinkStack_Create();
	LinkStack_Push(handle, (LinkStackNode*)&s1);
	LinkStack_Push(handle, (LinkStackNode*)&s2);
	LinkStack_Push(handle, (LinkStackNode*)&s3);

	Student* tmp = (Student*)LinkStack_Top(handle);
	printf("栈顶元素的值是[%d]\n", tmp->age);

	//遍历删除元素
	while (LinkStack_Size(handle) > 0)
	{
		Student* tmp = (Student*)LinkStack_Pop(handle);
		printf("被删除元素的值是[%d]\n", tmp->age);
	}
	LinkStack_Clear(handle);

	LinkStack_Destroy(handle);
	return 0;

}

输出结果如下图:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值