栈的链式存储就是线性表的链表
区别在于链表是任意位置都可以删除和插入,但是栈是只能一段插入和删除的,所以在链表的一段进行删除和插入就是栈的实现


顺序存储结构

//栈的顺序存储结构
#include<stdio.h>
#include<stdlib.h>
#define MaxSize 5
typedef struct sqtack
{
	int data[MaxSize];
	int top;
}SqStack;
void InitStack(SqStack& s)//初始化栈
{
	s.top = -1;
}
bool testStack(SqStack& s)//判断栈是否为空
{
	if (s.top == -1) return true;
	else return false;
}
bool Push(SqStack& s)//入栈
{
	for (int i = 0; i < 5; i++)
	{
		printf("请输入一个数字:");
		int x;
		scanf_s("%d",&x);
		if (s.top == MaxSize - 1) return false;
		else s.data[++s.top] = x;
	}
	return true;
}
bool Pop(SqStack& s, int &x)//出栈
{
	if (s.top == -1)return false;
	else {
			x = s.data[s.top--];
		}
	return true;
}
bool GetTop(SqStack& s,int &i)//读栈顶元素
{
	if (s.top == -1) return false;
	else i = s.data[s.top];
	return true;
}
void main()
{
	SqStack s;
	InitStack(s);//初始化一个栈
	//判断栈是否是空栈
	if (testStack(s))
	{
		printf("初始化完毕,栈为空\n");
	}
	//进栈
	if (Push(s))
	{
		printf("入栈完毕\n");
	}
	int x,i;
	//读取栈顶元素
	if (GetTop(s, i))
	{
		printf("读栈成功,栈顶元素是:%d\n",i);
	}
	//出栈
	if (Pop(s, x))
	{
		printf("出栈成功!\n");
	}
}

在这里插入图片描述


链式存储

//栈的链式存储-带头节点
#include<stdio.h>
#include<stdlib.h>
typedef struct LNode
{
	int data;
	struct LNode* next;
}*LinkList,Lnode;
//LinkList List_HeadInsert(LinkList& L)//头插法建立栈
//{
//	L = (LinkList)malloc(sizeof(LinkList));
//	L->next = NULL;
//	Lnode* node;
//	for (int i = 0; i < 5; i++)
//	{
//		printf("请输入一个数字:");
//		int x;
//		scanf_s("%d",&x);
//		node = (Lnode*)malloc(sizeof(Lnode));
//		node->data = x;
//		node->next = L->next;
//		L->next = node;
//	}
//	node->next = NULL;
//	return L;
//}
LinkList List_Taillnert(LinkList& L)//尾插法建立栈
{
	L = (LinkList)malloc(sizeof(LinkList));
	L->next = NULL;
	Lnode* node,*a=L;//*a是指向前驱的指针
	for (int i = 0; i < 5; i++)
	{
		printf("请输入一个数字:");
		int x;
		scanf_s("%d",&x);
		node = (Lnode*)malloc(sizeof(Lnode));
		node->data = x;
		a->next = node;
		a = node;
	}
	node->next = NULL;
	return L;
}
LinkList List_Delete(LinkList& L)
{
	int i;
	Lnode* node=L->next;
	i= node->data;
	L->next = node->next;
	free(node);
	return L;
}
void List_GetElem(LinkList& L,int &x)
{
	Lnode* node = L;
	x = node->next->data;
}
void put(LinkList& L)
{
	LinkList b =L;
	for(int i=0;i<5;i++)
	{
		printf("%d",b->next->data);
		b = b->next;
	}
}
void main()
{
	LinkList L;
	//List_HeadInsert(L);//头插法建立栈
	List_Taillnert(L);//尾插法建立栈
	List_Delete(L);//删除最上方元素在栈
	int x;
	List_GetElem(L,x);//查找最上方栈的元素
	printf("最上面的元素是:%d\n",x);
	put(L);
}

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值