数据结构:栈 ADT :使用链表实现对栈的基本操作。

数据结构:栈,及对栈的基本操作

这一篇博客呢,博主会针对栈这个东西,以及我们使用链表对栈的最基本操作进行一系列讲解。这部分内容博主会将其归到数据结构一框中,改框架还会不断更新。

目录

栈模型

说到栈,这个熟悉又陌生的字眼,我们在很多地方见过他,却不知道它到底是什么。其实它~并不复杂。
栈:限制插入和删除只能在一个位置进行的表。
说白了,如果我们是用链表实现,那么他就是一个链表,只不过他的插入和删除只能在一个位置进行罢了。我们对栈的基本操作有进栈和出栈。(这里我们用链表实现)我们将push命名为进栈,将pop命名为出栈(之后我们会编写这两个函数)。
进栈:插入元素 出栈:删除最后插入的元素
栈的顶:我们最后插入的元素存在于某个位置,这个位置便是栈的顶。同时,栈模型只有一个元素可见,而这个元素便是栈的顶存储的元素
很多小伙伴应该明了了,其实栈就是一种结构罢了。
ok基本概念到这里,我门开始操作。

栈的基本操作

首先呢,我们需要做一些准备吗,前面已经说了,利用链表操作,说白了栈就是链表。那么我们的操作自然是对链表操作。

#include<stdio.h>
#include<stdlib.h>
typedef struct Node *ptr;
typedef ptr stack;
int isempty(stack s);//检测栈是否为空
stack creatstack();//创建一个栈
void makeempty(stack s);//使栈归空
void pop(stack s);//出栈 
void push(int m,stack s);//元素进栈 
int top(stack s);//返回栈顶元素 
struct Node//声明结构体
{
	int n;
	ptr next;
};

ok,以上代码算是基本工作,小伙伴们要注意,这里博主为省下之后得多敲的结构体的名字,所以将他typedef了,这个操作有时候很有用,大家可以去网上搜一下,很多讲解,博主不必浪费口舌。

  1. 我们先实现,判断一个栈是否为空,因为后面要直接用到。
int isempty(stack s)//检测是否为空 
{
	return (s->next==NULL);//为空返回1否则返回0,与链表如出一辙 
}

这里并不难,我们返回0或者1来充当判断条件即可。这里我们的链表是有一个空的头结点的,因此我用了s->next,如果小伙伴创建链表的方式与我略有不同,稍加改动即可。
2. 实现第二个,创建一个空栈。这里我说的是空栈哦,注意前面函数的创建并没有说到是空栈😉

stack creatstack()//创建一个空栈 
{
	stack s=(stack)malloc(sizeof(struct Node)); 
	if(s==NULL)
		printf("out of space\n");
	else
		s->next=NULL;
	makeempty(s);
	return s;
}
void makeempty(stack s)//使栈为空 
{
	if(s==NULL)
		printf("must creat a stack\n");
	else
		while(!isempty(s))
			pop(s);
}

之前说过,链表是有一个空的头结点的。这里还有一个出栈操作为实现。接下里我们实现进栈和出栈。
3. 进行出栈和进栈,这是我们对栈最根本的操作,同时它差不多也就这俩操作了。
进栈:

void push(int m,stack s)//实现入栈操作 
{
	stack p;
	if(isempty(s))
		printf("empty\n");
	else
	{
		p->n=m;
		p->next=s->next;
		s->next=p;
	}
}

出栈:

void pop(stack s)
{
	stack first;
	if(isempty(s))
		printf("empty stack");
	else
	{
		first=s->next;
		s->next=s->next->next;
		free(first);//释放空间 
	}
}

其实,本质上来说就是对链表的操作,因为对链表操作博主之前已经讲过,这里边不唠叨了。
4. 返回栈顶元素,我们之前说过,只有栈顶的元素是可见的,因此我们需要一个返回栈的顶的元素的函数

int  top(stack s)//返回栈顶元素 
{
	if(!isempty(s))
		return s->next->n;
	printf("empty");
	return 0;
}

代码简单易懂,无需多讲。

栈的初总结

  1. 首先呢,所谓数据结构其实从本质上来说还是我们对于c语言各种内容的应用,并不是什么新知识,所以学习这方面的小伙伴不用去担心有多难,它从某种程度来说算是对c语言较为高级的应用吧。
  2. 这里的栈也是结构的一种,我们可以通过链表操作,自然也可以通过数组操作。两者差距并不大,博主大概会专门写一次对数组的操作。
  3. 大家需要注意,我在看资料的时,资料所提供的伪代码很粪,因此博主特意去完善了代码,小伙伴们如果在看书或看网课时,觉得很难,那是伪代码的特质😄不必担心,博主还需要一段时间会特意学习数据结构,因此这方面会更新的很快,觉得困难的小伙伴可以跟着博主学,毕竟博主的每一篇博客,都是往基础的部分去靠,尽量简单化
  4. 大家再将伪代码“吵完后”,不要直接在编译器上跑跑😂,我们在敲代码时,缺了什么都不能缺主函数啊,如果没写int main()就会如下
    在这里插入图片描述
    😂😂

今天到这里了,小伙伴们加油哦!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值