数据结构与算法——栈的顺序结构及实现

目录

前言

一、栈的相关概念

二、栈的顺序存储结构及实现

2.1   栈的顺序储存结构 

2.2   进栈操作

2.3   出栈操作

总结


前言

我相信咱们很多男生都对枪械有一种天生的喜爱,接下来咱们讲的东西就跟这个手枪弹夹比较的类似。众所周知,手枪弹夹的子弹是一颗一颗的压进去的,你不妨留意一下,你会发现你最后压进去的子弹是最先打出来的,最先压进去的子弹反而是最后打出去的。

像这样先进去反而要后出来的数据结构,我们称之为栈。


一、栈的相关概念

栈:是限定仅在表尾进行插入和删除操作的线性表。

  • 我们把允许插入和删除的一端称为栈顶,另一端称为栈底;
  • 不含任何数据元素的栈称为空栈;
  • 栈又称为后进后出的线性表,简称LIFO结构。

举例来说,如果我们现在是有3个整型数字元素1、2、3依次进栈,会有哪些出栈次序呢?

  • 第一种:1、2、3进,再3、2、1出。这是最简单最好理解的一种,出栈次序为3、2、1。
  • 第二种:1进,1出,2进,2出,3进,3出。也就是进一个就出一个,出栈次序为1、2、3。
  • 第三种:1进,2进,2出,1出,3进,3出。出栈次序为2、1、3。
  • 第四种:1进,1出,2进,3进,3出,2出。出栈次序为1、3、2。
  • 第五种:1进,2进,2出,3进,3出,1出。出栈次序为2、3、1。

从这个简单的例子就能看出,只是三个元素,就有五种可能的出栈次序,如果元素量更多,其实出栈的变化将会更多。这个知识点一定要弄明白。

二、栈的顺序存储结构及实现

2.1   栈的顺序储存结构 

既然栈是线性表的特例,那么栈的顺序储存其实也是线性表顺序储存的简化。

我们通常使用下标为0的一端来最为栈底,因为首元素都存在栈底,变化最小。我们还需要定义一个top变量来表示栈顶元素在数组中的位置,就如同游标卡尺里的游标,可以来回移动。这也就意味着top可以变大变小,但不能超过数组的长度。当栈存在一个元素时,top=0,因此通常把空栈的判定条件定为top=-1。

来看看栈的结构定义:

#define maxsize 1000

typedef struct{
	
	int data[maxsize];      //暂定数据类型为整型 
	
	int top;                //用于栈顶指针 
}stack;

2.2   进栈操作

代码如下:

status push(stack *s,int e)
{
	if(s.top==maxsize-1)   //栈满了
	{
		return wrong;
	}
	
	s.top++;        //将栈顶指针+1
	s.data[s.top]=e;    //将新插入元素赋值给栈顶空间
	
	return ok; 
	 
}

2.3   出栈操作

其代码如下: 

status pop(stack *s,int *e)
{
	if(s.top==-1)         //此栈为空栈,返回wrong 
	{
		return wrong;
	}
	
	*e=s.data[s.top];     //将要删除的栈顶元素赋值给e
	s.top--;
	
	return ok; 
	
}

总结

栈的实质就是一个先进后出的结构,把握好这一点,就能很好的理解什么是栈结构。对于栈的顺序储存结构的操作,这两个操作都没有设计循环语句,因此时间复杂度均是O(1)。

你可能感兴趣的:(数据结构)