数据结构——栈

一、栈的初始化

顺序栈在内存中的存储时连续的一片,因为需要用数组的形式开辟一片空间

同时,数据的输入和输出也和其他数据结构有些不同

这里的特点时先入后出,后入先出,last in first out

如下图所示:

从图中我们可以直观的看出,数据一被放在了最下面,必须从最顶端一个个往外拿。

并且,此时最上面被称为栈顶。最下面称为栈底。

初始化一个空栈的代码如下:

#define MAX 10
typedef struct {
	int data[MAX];
	int top;
}s;

int main()
{
	s s1;
	s1.top = -1;//第二种情况是:s1.top=0;
	return 0;
}

类似于我们初始化一个顺序表一样。不同的是  顺序表中的int类型的代表数据的数量,而上面代码中的top起到了指针的作用,指向了第几个数据。

如下图所示:

 二、栈的增、删、查、判空满

 这里分top=0 和top=-1 这两种情况

(一)、当top=-1时   

1.判断栈空满

代码如下:

int main()
{
	s s1;
	s1.top = -1;
	//中间进行了一系列操作后
	if (s1.top == -1)
	{
		printf("此栈为空");
	}
	else if (s1.top == MAX - 1)
	{
		printf("此栈已满");
	}
	return 0;
}

s1.top=-1 时为空很容易理解。就是指向第一个数据的下一个位置,表示目前还没有数据输入

s1.top=MAX-1表示开辟的空间的最上面的位置。因为数组下标是从0开始  a[MAX-1]表示最上面的数据。


2.对栈增加数据

代码如下:

int main()
{
	s s1;
	s1.top = -1;
	int x = 10;//要输入的数据
	s1.top = s1.top + 1;
	s1.data[s1.top] = x;//也可以写成s1.data[++s1.top]=x;
	return 0;
}

这里需要注意的是s1.top = s1.top + 1;这句代码  因为一开始top是-1  ,+1之后才代表的是要输入的数组下标的位置。


3.对栈消除数据

因为我们对栈的操作,其实就是对栈顶进行的操作,因此我们只需要把注意力放在栈顶就可以了

代码如下:

int main()
{
	s s1;
	s1.top = -1;
	s1.top = s1.top - 1;
	return 0;
}

这里我们只对top进行-1操作。实际上栈顶的数据并没有删除。我们只是在逻辑上不在考虑刚才栈顶的数据。


4.查栈顶数据

s1.data[s1.top]

这是top为-1时的情况,很简单,没什么可说的

(二)top=0时

1.判断栈空满

代码如下:

int main()
{
	s s1;
	s1.top = 0;
	//中间进行一系列增减操作
	if (s1.top == 0)
	{
		printf("此栈为空");
	}
	else if (s1.top = MAX)
	{
		printf("此栈已满");
	}
	return 0;
}

和top=-1时有一些区别

top=0的含义时指向栈顶的上一个空间位置。top=0时,说明没有数据

当top=MAX时,说明第下标为MAX-1的位置已经有数据了 。说明此时栈满了


2.入栈操作

代码如下:

int main()
{
	s s1;
	s1.top = 0;
	int x = 10;//要入栈的数据
	s1.data[s1.top] = x;
	s1.top=s1.top+1; //也可以写成s1.data[s1.top++]=x;
	return 0;
}

因为top指向栈顶的上一个位置,所以我们先给栈顶上一个位置赋值,然后再top+1.

这和top=-1时的情况有一定的区别。


3.出栈操作

代码如下:

int main()
{
	s s1;
	s1.top = 0;
	s1.top = s1.top - 1;
	int x = s1.data[s1.top];//x为要删除的数据
	return 0;
}

我们先逻辑上让top-1  。此时top指向的时栈顶的数据。而这就是要删除的数据


4.查

代码如下:

x = s1.data[top - 1];

三、链栈

回顾单链表的增减操作中,有一种叫做头插法。

和这里的栈的入栈出栈操作有一定的相似。

头插法代码如下:

typedef struct s{
	int a;
	struct s* next;
}s;

int main()
{
	s *p;
	p = NULL;
	s* s1 =(s*) malloc(sizeof(s));
	p = s1;
	s1->a = 10;
	s1->next = NULL;

	return 0;
}

四、共享栈

开辟一片空间,定义两个int 类型的top

如图所示:

 一个在这个空间的上面,一个在这个空间的下面。

top在下面的情况我们已经考虑。

当top在上面时,对栈进行入栈和出战操作时,top+1 和-1操作时和下面反着的,掌握了下面,上面的注意区别就可以了。

这里只说明如何判断这个共享栈满的情况:

s1.top0+1==s1.top1;

当这句成立。则判断栈是满的

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值