栈的介绍
来自百度百科的介绍:
栈(stack)又名堆栈,它是一种运算受限的线性表。限定仅在表尾进行插入和删除操作的线性表。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。
实际上我们简单的来理解栈的概念:
1.栈是一种存储结构。也就是说归根到底它是用来存储数据的,就像数组和链表。
2.栈是一种受限制的线性表,每次添加元素必须放在栈顶,删除元素也要从栈顶开始删除,是一种先进后出FILO的数据存储结构。
就好像一个乒乓球筒,上面是敞开的,下面是关闭的。我们每次放球或者取球,都要从上面那个开口来进行。
也就是说,假设我们现在要取出A球,我们必须先按顺序取出E,D,C,B球,才可以将A球取出,而不能直接取出A球。这也就是受限制的意思,栈是一种受限制的线性表。
栈的C语言实现
用C语言实现栈的操作,需要对C语言中的结构体和链表有一定理解认识。如果对结构体和链表完全不了解的可以参考我的另一篇博文
最接地气的C语言结构体与链表教程----手把手教你从0开始写学生成绩管理系统(附完整代码)
栈的操作常见分两种,链式栈和顺序栈。其中链式栈是通过链表来实现的,顺序栈则是依赖数组。两者的操作方式略有区别。简单来说就是链式栈是通过指针不断指向下一个元素的地址来实现栈元素的进出,而对于顺序栈来说,因为数据在内存中存放在连续的数据块里,只需要对指针进行自加自减操作,即可实现栈元素的读取。这篇博文主要介绍的是链式栈的实现与相关操作。
在明白了栈是什么之后,很容易理解栈的基本操作。栈有以下几个基本操作
1.入栈操作:将一个元素存入栈中;
2.出栈操作:将元素从栈中取出;
3.获取栈顶元素;
4.判段栈是否为空;
#include <stdio.h>
#include <stdlib.h>
struct node {
//链表中定义节点的结构体
int data;
struct node* next;
};
struct node* creatnode(int data) //链表中的创建节点函数
{
struct node* newnode = (struct node*)malloc(sizeof(struct node));
newnode->data = data;
newnode->next = NULL;
return newnode;
}
在开始实现栈操作之前,先做好准备工作。因为是链式栈,所以涉及到链表的基础内容。这部分内容可以参考我的另一篇博文都有详细介绍,这里在做完准备工作后,直接进入正题。首先我们定义一个栈的结构体,并和创建节点一样的,创建一个栈。
struct stack{
struct node* stacktop; //在栈结构体当中,创建一个node结构体的栈顶指针
int size; //用来记录栈中元素个数
};
struct stack* creatstack() //创建栈
{
struct stack* mystack = (struct stack*)malloc(sizeof(struct stack)); //分配内存空间
mystack->stacktop = NULL;
mystack->size = 0; //变量初始化
return mystack; //返回变量
}
这里定义了一个stack类型的结构体,这个结构体中包含一个int类型的size,用来记录栈中元素的个数;还包含了一个node* 指针型的结构体,代表栈顶指针,也可以理解为链表的表头。
接下来继续写入栈函数,在入栈函数中我们需