一、栈的初始化
顺序栈在内存中的存储时连续的一片,因为需要用数组的形式开辟一片空间
同时,数据的输入和输出也和其他数据结构有些不同
这里的特点时先入后出,后入先出,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;
当这句成立。则判断栈是满的