当前位置:首页 > 百科大全 > 正文内容

栈的概念与基本操作(详解)(c语言)

admin1周前 (05-26)百科大全16

的概念与基本操作(详解)(c语言)

[id_[id_1951212200]041599946]id_1428770756]

栈是一种受约束的线性表,即特殊的线性表。

栈又称为堆栈。

具体而言,栈是一种具有特定性质的线性数据结构在带链的栈中,栈顶指针的动态变化,它仅允许在序列的一端进行元素的插入和移除操作。

栈是一种先入后出,后入先出的结构。

为了详细的表示栈,我找了个图。

栈的概念与基本操作(详解)(c语言) 第1张

在图中展示的序列中,各个元素按照a1、a2、……、an的顺序逐一被加入,而在进行出栈操作时栈的概念与基本操作(详解)(c语言),an元素将首先被移除,而a1元素则最后被取出,从而实现了先进后出、后进先出的操作原则。

栈的基本操作

栈只能在一段(即栈顶,top)进行插入和删除操作。

表的另一端叫做栈底。

当栈中没有元素叫做空栈。

插入数据叫入栈(push)。

栈的插入操作称为进栈或入栈。

删除数据叫出栈(pop)。

栈的删除操作称为出栈或退栈。

一个简单直观的方法是将栈通过数组来构建。这种方法引出了我们接下来要介绍的栈的第一种基本结构——顺序栈。

## 顺序栈

顺序栈的定义涉及一种存储方式,即通过连续的存储空间来按顺序存放数据元素,从栈底至栈顶依次排列。鉴于栈的运作机制要求在栈顶进行元素的添加与移除,因此在带链的栈中,栈顶指针的动态变化,在顺序栈中必须设立一个位置指针,即栈顶指针top在带链的栈中,栈顶指针的动态变化,以实时反映栈顶元素在顺序栈中的具体位置。

栈的存储结构通常包括一个一维数组以及一个用于标识栈顶元素所在位置的变量。

顺序栈的结构

# define maxsize 100
typedef struct stack
{
	element data[maxsize];
	int top;
}stack,*pstack;

栈的概念与基本操作(详解)(c语言) 第2张

顺序栈的基本操作

1.初始化

void initstack(pstack s)
{
	s->top=-1;
}

数组下标是从0开始的,top最初要指向-1.

2.入栈

void push(pstack s,element x)
{
	if(s->top==maxsize-1)\\进栈要判断栈满
	{
		printf("栈满\n");
		return;
	}
	else
	{
		s->data[++(s->top)]=x;
		return;
	}
}

3.出栈

element pop(pstack s)
{
	if(s->top==-1)\\出栈要判断是否栈空
	{
		printf("栈空\n")return ERROR; 
	 } 
	else
	{
		return s->data[(s->top)--];
	}
}

双端栈

双端栈技术涉及将数组一分为二栈的概念与基本操作(详解)(c语言),分别作为两个栈的底部,通过从数组的两端向中间添加元素来最大化地使用数组空间。这一方法巧妙地运用了栈的基本属性,即栈底位置保持不变,而栈顶位置则会随着元素的进出而动态调整。

在两端各设置一个栈顶指针,分别标记为top1和top2,它们分别指向左右两侧填充内容的末尾元素。

若左右两侧的栈中元素数量存在差异,那么判定栈是否已满的标准是(以左栈的栈顶指针为top1,右栈的栈顶指针为top2为例),即top2与top1之间的差值为1。(这表示两个栈顶指针已相遇。)

双端栈的结构

# define maxsize 100
typedef struct stack
{
	element data[maxsize];
	int top1;
	int top2;
}stack,*pstack;

1.初始化

void initstack(pstack s)
{
	s->top1=-1;
	s->top2=maxsize;
}

若数组索引范围从0至maxsize,那么最初两个栈顶指针分别指向-1和maxsize,以此表明栈处于空状态。

2.进栈

void push(pstack s,element x,int a)
{
	if(s->top2-s->top1==1)\\两位置指针相遇则栈满
	{
		printf("栈满\n");
		return; 
	}
	if(a==1)
	{
		s->data[++(s->top1)]=x;
	}
	else if(a==2)
	{
		s->data[--(s->top2)]=x;
	}
}

3.出栈

element pop(pstack s,int a)
{
	if(a==1)\\确定是对左边进行出栈
	{
		if(s->top1==-1)
		{
			printf("栈空");
			return ERROE;
		}
		else
		{
			return s->data[(s->top1)--];
		}
	}
	else if(a==2)\\确定是对右边进行出栈
	{
		if(s->top2==maxsize)
		{
			printf("栈空");
			return ERROE;
		}
		else
		{
			return s->data[(s->top2)++];
		}
	}	
}

栈的结构可以通过数组来实现存储,与此类似,我们也可以采用单向链表的方式来对栈进行存储。

##链栈

链栈实质上是一种基于单链表的存储方式,其结构特征与单链表相似。在链栈中,所有的插入与删除动作均需在栈顶进行。

单项链表具有两个端点,若以链表头部作为栈顶进行插入和删除操作较为便捷,而以链表尾部作为栈顶进行插入同样方便,然而一旦进行删除操作,整个链表便会消失,此时便无法通过当前节点访问到前一个节点。

因此对于链栈,链表的头作为链栈的栈顶。

链栈的结构

typedef struct stack
{
	element data;
	struct stack *next;
}stack,*pstack;

1.构建一个栈的头结点(不带元素)

pstack creatstack()
{
	pstack s;
	s=(pstack)malloc(sizeof(stack));
	s->next=NULL;
	return s;
}

2.入栈(单链表的头插法)

void push(element x,pstack s)
{由于栈与数组不同,它并没有固定的内存容量,因此在进行入栈操作时,无需对内存是否已满进行判断,即可直接调用可用内存空间。
	pstack p=(pstack)malloc(sizeof(stack));
	p->data=x;
	p->next=s->next;
	s->next=p;
}

3.出栈(删除并返回栈顶元素)

element pop(pstack s)
{
	pstack p;
	element a;
	if(s->next==NULL)
	{
		printf("栈空");
		return NULL; 
	}
	else
	{
		p=s->next;
		s->next=p->next;
		a=p->data;
		free(p);
		return a;
	}
}

加入微信交流群:************ ,请猛戳这里→点击入群

扫描二维码推送至手机访问。

版权声明:本文由多彩生活知识库发布,如需转载请注明出处。

本文链接:https://www.dczhishi.com/post/3112.html

分享给朋友:

“栈的概念与基本操作(详解)(c语言)” 的相关文章

家居生活百科:家具日常维护要点

家居生活百科:家具日常维护要点

家具是家居生活中不可或缺的元素,它们不仅为我们提供了舒适的栖息之所,更是家居装饰的重要组成部分。若不注重家具的日常维护,它们可能会逐渐失去原有的光泽和质感,甚至缩短使用寿命。因此,了解家具日常维护的要点至关重要。一、木质家具1. 清洁定期用柔软的干布擦拭木质家具,去除表面的灰尘和污渍。避免使用湿布,...

生活百科:如何让室内香气宜人

生活百科:如何让室内香气宜人

在日常生活中,我们常常希望自己的室内环境充满宜人的香气,让家变得更加温馨、舒适。无论是在忙碌的工作后回到家中,还是在闲暇的时光里享受独处的宁静,室内的香气都能给我们带来愉悦的感受。那么,如何让室内香气宜人呢?下面就为大家介绍一些简单实用的方法。一、选择合适的香氛产品1. 香薰蜡烛香薰蜡烛是一种常见的...

生活百科:常见蔬菜病虫害防治

生活百科:常见蔬菜病虫害防治

蔬菜在生长过程中,常常会受到各种病虫害的侵袭,这不仅会影响蔬菜的产量和品质,还可能对人体健康造成潜在威胁。因此,掌握常见蔬菜病虫害的防治方法至关重要。以下是一些常见蔬菜病虫害的防治措施:一、白菜类蔬菜病虫害防治1. 白菜霜霉病- 症状:叶片正面出现淡黄色不规则病斑,叶背面有白色霉层。严重时病斑连片,...

生活百科:汽车驾驶省油技巧

生活百科:汽车驾驶省油技巧

汽车作为现代生活中不可或缺的交通工具,其油耗问题一直备受关注。如何在驾驶过程中做到省油,不仅能为我们节省开支,还对环境友好。下面就为大家介绍一些汽车驾驶的省油技巧。一、驾驶习惯方面1. 平稳起步和加速在启动汽车时,不要猛踩油门,应缓慢平稳地踩下踏板,让发动机平稳运转后再逐渐加速。在行驶过程中,尽量避...

生活百科:手工皂制作全流程

生活百科:手工皂制作全流程

手工皂,以其天然、温和、滋养的特性,越来越受到人们的喜爱。制作手工皂不仅是一种有趣的 DIY 活动,还能让你亲手创造出属于自己的护肤佳品。下面,我们将为大家详细介绍手工皂制作的全流程。一、准备材料1. 油脂:常见的手工皂制作油脂有橄榄油、椰子油、棕榈油等。不同的油脂具有不同的特性,如橄榄油滋润保湿,...

生活百科:如何种植多肉植物

生活百科:如何种植多肉植物

多肉植物以其独特的外形、丰富的品种和较低的养护难度,近年来受到了越来越多植物爱好者的喜爱。无论是放在窗台、阳台还是室内的书桌、茶几上,多肉植物都能为生活增添一抹绿色和生机。下面,我们就来详细了解一下如何种植多肉植物。一、选择合适的多肉植物在开始种植多肉植物之前,首先要选择适合自己的品种。多肉植物的品...