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

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

admin2周前 (05-26)百科大全20

的概念与基本操作(详解)(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://dczhishi.com/post/3112.html

分享给朋友:

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

探秘百科世界:神秘的宗教文化与信仰传承

探秘百科世界:神秘的宗教文化与信仰传承

宗教,作为人类社会发展过程中一种独特的文化现象,承载着深厚的历史、哲学和精神内涵。它宛如一幅绚丽多彩的画卷,在世界的各个角落绽放着神秘的光芒,吸引着无数人的关注与探索。从古老的东方到广袤的西方,从神秘的亚洲到热情的非洲,不同的宗教文化如繁星般点缀着地球的每一个角落。佛教,以其深邃的智慧和慈悲的精神,...

生活百科:室内空气净化妙招

生活百科:室内空气净化妙招

在现代生活中,我们大部分时间都在室内度过,室内空气质量的好坏对我们的健康有着至关重要的影响。良好的室内空气可以让我们保持精神饱满、心情愉悦,而污染的室内空气则可能引发各种疾病,如过敏、呼吸道感染等。因此,掌握一些室内空气净化妙招是非常必要的。一、通风换气通风是最简单、最有效的室内空气净化方法之一。打...

生活百科:自制美味泡菜的方法

生活百科:自制美味泡菜的方法

泡菜,作为一种深受人们喜爱的传统美食,以其酸辣可口的味道和丰富的口感,为我们的餐桌增添了不少色彩。在家中自制美味泡菜,不仅可以满足自己的味蕾需求,还能体验到烹饪的乐趣。下面,我将为大家介绍一种简单易做的自制泡菜方法。一、准备材料1. 蔬菜:选择新鲜、无损伤的蔬菜,如白菜、萝卜、黄瓜等。根据个人口味和...

生活百科:如何挑选优质蜂蜜

生活百科:如何挑选优质蜂蜜

蜂蜜,作为一种天然的甜味剂和营养丰富的食品,深受人们的喜爱。市场上的蜂蜜种类繁多,质量参差不齐,如何挑选优质的蜂蜜成为了许多消费者关注的问题。下面,我们将为大家介绍一些挑选优质蜂蜜的方法。一、观察外观优质的蜂蜜通常呈现出清澈透明的状态,无杂质、无气泡、无沉淀。如果蜂蜜中出现了较多的杂质、气泡或沉淀,...

生活百科:孕妇饮食的注意事项全攻略

生活百科:孕妇饮食的注意事项全攻略

孕妇的饮食对于胎儿的健康发育至关重要。在这个特殊的时期,孕妇需要格外注意饮食的选择和搭配,以确保自己和胎儿获得足够的营养。以下是一份孕妇饮食的注意事项全攻略,希望能为孕妇们提供一些帮助。一、保证充足的热量摄入孕妇需要比平时摄入更多的热量,以满足自身和胎儿的需求。一般来说,孕妇每天需要额外摄入 300...

生活知识:自制健康又美味的酱料秘籍

生活知识:自制健康又美味的酱料秘籍

在厨房的世界里,酱料就像是魔法的调味料,能够将普通的食材变成令人垂涎欲滴的佳肴。自制酱料不仅健康,还能让你品尝到独一无二的味道。今天,我们就来探索一些自制健康又美味的酱料秘籍,让你的餐桌更加丰富多彩。一、番茄肉酱番茄肉酱是意大利面的最佳伴侣,也是自制酱料中的经典之作。制作番茄肉酱,你需要准备新鲜的番...